home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 July: Mac OS SDK / Dev.CD Jul 96 SDK / Dev.CD Jul 96 SDK2.toast / Development Kits (Disc 2) / Open Transport / OT 1.1 GM Documentation / OT Docs Text Only / Open Transport Client Note < prev   
Encoding:
Text File  |  1996-03-11  |  318.5 KB  |  4,334 lines  |  [TEXT/MSWD]

  1.  
  2.  
  3.  
  4. OpenTransport Client Developer Note, Rev 1.1b14    1/18/96    page i
  5. Copyright © 1992-1996 Apple Computer, Inc. All rights reserved
  6.  
  7.  
  8.  
  9. Copyright © 1992-1996 Apple Computer, Inc. All rights reserved
  10.  
  11.  
  12.     Contents 
  13.  
  14.  
  15. OpenTransport Client Developer Note, Rev 1.1b14    1/18/96    page i
  16. Copyright © 1992-1996 Apple Computer, Inc. All rights reserved
  17.  
  18.  
  19.     About this Document
  20.  
  21.  
  22.     About This Document
  23.  
  24.  
  25.     Introduction to Open Transport
  26.  
  27.  
  28.     Getting Started
  29.  
  30.  
  31.     Endpoints 
  32.  
  33.  
  34.     Open Transport Data Structures 
  35.  
  36.  
  37.     Opening and Closing Endpoints 
  38.  
  39.  
  40.     Binding and Unbinding Endpoints 
  41.  
  42.  
  43.     Endpoint information 
  44.  
  45.  
  46.     Allocating Endpoint structures 
  47.  
  48.  
  49.     Managing Options 
  50.  
  51.  
  52.     Connectionless Datagrams 
  53.  
  54.  
  55.     Connections 
  56.  
  57.  
  58.     Transactions 
  59.  
  60.  
  61.     Connection-Oriented Transactions
  62.  
  63.  
  64.     Address Mapping
  65.  
  66.  
  67.     Utility functions
  68.  
  69.  
  70.     Native functions
  71.  
  72.  
  73.     Appendix A - Sample Code
  74.  
  75.  
  76.     Appendix B - Endpoint States
  77.  
  78.  
  79.     Appendix C - Event Codes
  80.  
  81.  
  82.     Appendix D - Result Codes
  83.  
  84.  
  85.     Appendix E - TII and XTI
  86.  
  87.  
  88.     Appendix E - TII and XTI
  89.  
  90.  
  91.     Index
  92.  
  93.  
  94.     Index
  95.  
  96.  
  97.     
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111. Open Transport
  112. Client Developer Note
  113. PRELIMINARY
  114. Revision 1.1b14
  115. 11/18/96
  116.  
  117. Abstract:
  118. This document describes the application programming interfaces of the Open Transport endpoint and mapper libraries, which lets Macintosh developers write transport-independent network applications.
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140. © 1992-1995 Apple Computer Inc. Apple, the Apple logo, AppleTalk, Macintosh, and MPW are trademarks of Apple Computer, Inc., registered in the United States and other countries. Finder and System 7 are trademarks of Apple Computer, Inc. OS/2 is  a registered trademark of International Business Machines Corporation. Windows is a trademark of Microsoft Corporation. UNIX is a registered trademark of UNIX  System Laboratories, Inc. 
  141.  
  142. Apple Computer, Inc., thanks X/Open Company Limited for permission to include excerpts from its X/Open CAE Specification: X/Open Transport Interface (XTI) (Document Reference XO/CAE/92/600 or C192 ISBN 1-872630-29-4) throughout this manual.
  143.  
  144. .c1.Contents
  145. Contents    iii
  146. About This Document    vii
  147. Related Documents    vii
  148. Revision History    vii
  149. Format of Function Descriptions    viii
  150. Introduction to Open Transport    1
  151. Transport Independence    1
  152. Transport Transparency    1
  153. Transaction Protocols    2
  154. Operating Environment    2
  155. Client Programming Interfaces    2
  156. Open Transport and Interrupt Routines    3
  157. Getting Started    4
  158. Determining if Open Transport is installed    4
  159. Using Open Transport From Stand-Alone Code    4
  160. Using Open Transport From Applications    4
  161. Using Open Transport From C Clients    5
  162. Using Open Transport From C++ Clients    5
  163. About Providers    5
  164. Specifying provider services    6
  165. Specifying ports    6
  166. Modes of Operation    9
  167. Blocking    9
  168. AckSends    9
  169. Provider Events    10
  170. Provider Functions    11
  171. Result codes    11
  172. Handling Events    12
  173. Using Notifier Routines    12
  174. InstallNotifier    14
  175. RemoveNotifier    16
  176. Setting the Mode of Operation    17
  177. SetSynchronous    17
  178. SetAsynchronous    18
  179. IsSynchronous    19
  180. Controlling Operations on a Provider    20
  181. OTCloseProvider    20
  182. SetBlocking    21
  183. SetNonBlocking    22
  184. IsNonBlocking    23
  185. AckSends    24
  186. DontAckSends    25
  187. IsAckingSends    26
  188. TransferOwnership    29
  189. About Endpoints    30
  190. Endpoint States    31
  191. Connectionless Endpoints    32
  192. Connection-Oriented Endpoints    34
  193. Polling for Asynchronous Events    35
  194. Using Asynchronous Mode    35
  195. Handling Events for endpoints    38
  196. Open Transport Data Structures    39
  197. TNetbuf Structure    40
  198. OTData Structure    41
  199. TEndpointInfo Structure    42
  200. Opening and Closing Endpoints    43
  201. OTOpenEndpoint    45
  202. OTAsyncOpenEndpoint    47
  203. Binding and Unbinding    49
  204. Bind    50
  205. Unbind    53
  206. Getting Information About an Endpoint    55
  207. GetEndpointInfo    55
  208. GetEndpointState    57
  209. Look    58
  210. GetProtAddress    59
  211. ResolveAddress    61
  212. Sync    63
  213. Allocating Structures    64
  214. Alloc    65
  215. Free    68
  216. Managing Options    69
  217. Overview    69
  218. Portability    70
  219. Option Format    70
  220. Option Negotiation    71
  221. Multiple Options and Options Levels    71
  222. Illegal Options    71
  223. Initiating an Option Negotiation    71
  224. Responding to a Negotiation Proposal    73
  225. Retrieving Information About Options    73
  226. Privileged and Read-Only Options    75
  227. Option Management of a Transport Endpoint    76
  228. The Option value T_UNSPEC    77
  229. The info Argument    77
  230. Summary    77
  231. OptionManagement    79
  232. Using Connectionless Datagrams    85
  233. SndUData    86
  234. RcvUDErr    88
  235. RcvUData    90
  236. Using Connections    92
  237. Initiating a connection    92
  238. Waiting for a Connection    94
  239. Tearing Down a Connection    95
  240. Connect    99
  241. RcvConnect    101
  242. Listen    103
  243. Accept    105
  244. SndDisconnect    108
  245. RcvDisconnect    110
  246. SndOrderlyDisconnect    112
  247. RcvOrderlyDisconnect    113
  248. Using Connection-Oriented Streams    114
  249. Snd    115
  250. Rcv    118
  251. Processing Transactions    120
  252. Initiating a Transaction Request    120
  253. Responding to a Transaction Request    121
  254. Connectionless Transactions    123
  255. SndURequest    125
  256. RcvURequest    127
  257. SndUReply    129
  258. RcvUReply    132
  259. CancelURequest    134
  260. CancelUReply    135
  261. Connection-Oriented Transactions    137
  262. SndRequest    138
  263. RcvRequest    140
  264. SndReply    142
  265. RcvReply    145
  266. CancelRequest    147
  267. CancelReply    148
  268. Address Mapping    149
  269. OTOpenMapper    150
  270. OTAsyncOpenMapper    152
  271. RegisterName    153
  272. DeleteName    155
  273. DeleteName    156
  274. LookupName    157
  275. Utility functions    159
  276. InitOpenTransport    159
  277. CloseOpenTransport    160
  278. OTCreateConfiguration    160
  279. OTCloneConfiguration    161
  280. OTDestroyConfiguration    162
  281. OTCreateOptions    163
  282. OTCreateOptionString    165
  283. OTEnterInterrupt    167
  284. OTLeaveInterrupt    168
  285. OTIdle    169
  286. OTDelay    170
  287. OTGetIndexedPort    171
  288. OTFindPort    172
  289. OTFindPortByRef    173
  290. OTCreatePortRef    174
  291. OTGetDeviceTypeFromPortRef    176
  292. OTGetBusTypeFromPortRef    177
  293. OTGetSlotFromPortRef    178
  294. OTCreateSystemTask    179
  295. OTDestroySystemTask    180
  296. OTScheduleSystemTask    181
  297. OTCancelSystemTask    182
  298. OTCanMakeSyncCall    183
  299. OTCreateDeferredTask    184
  300. OTDestroyDeferredTask    185
  301. OTScheduleDeferredTask    186
  302. Native functions    187
  303. OTYieldPortRequest    187
  304. Client callbacks    189
  305. Advanced Topics    191
  306. No-Copy Receives    191
  307. Autopush    193
  308. Appendix A - Sample Code    197
  309. Appendix B - Endpoint States    199
  310. Appendix C - Event Codes    201
  311. Appendix D - Result Codes    205
  312. Appendix E - Open Transport and XTI    209
  313. Function Names    209
  314. Extensions to XTI    213
  315. Data Structures    214
  316. Result Codes    214
  317. Index    217
  318.  
  319. .c1.About This Document;
  320. This document describes the application (client) programming interface of the Open Transport Library. Because the document is intended for all Open Transport client developers, it does not provide protocol-specific information.
  321. .c2.Related Documents
  322. Apple Shared Library Manager Developer’s Guide. This manual is part of the Apple Shared Library Manager distribution.
  323. X/Open Developer’s Specification (1990), Revised XTI (X/Open Transport Interface), ISBN# 1-872630-05-7.
  324. Addendum to Revised XTI (X/Open Transport Interface), August 1991.
  325. Inside AppleTalk®, Second Edition, Gursharan S. Sidhu, et. al., Addison-Wesley Publishing, Inc.
  326. .c2.Revision History
  327.  
  328. 01/18/96    Added a paragraph on kOTLookErr errors to the Rcv function
  329. 08/11/95    Updated to reflect revision 1.1b1 of OpenTransport
  330. 01/14/95    Updated to 1.0a3
  331. 10/10/94    Revision 1.0d18/Updated document.
  332. 09/16/94    Revision 1.0d16(numbering change to match up with builds)
  333.     Updated document.
  334. 07/18/94    Revision 1.0d13(numbering change to match up with builds)
  335.     Revise entire document to reflect revised client interface.
  336. 06/08/94    Revision 1.0d12(numbering change to match up with builds)
  337.     Revise entire document to reflect revised client interface.
  338. 02/14/94    Revision 1.0d8 (numbering change to match up with builds)
  339.     Revise entire document to reflect revised client interface.
  340. 11/15/93    Revision 2.0
  341.     Revise entire document to reflect revised client interface.
  342.     Delete reference to non-client entities and concepts.
  343.     Delete references to obsolete client concepts, routines, and data structures.
  344.     Delete references to planned functionality.
  345.     Add new information, and supplement existing information.
  346.     Reorganize and reformat entire document.
  347.     Change name to “Open Transport”.
  348.         .
  349.         .
  350.         .
  351. 8/13/91    Revision 1.0, second Draft
  352.     First distribution.
  353.  
  354. .c2.Format of Function Descriptions;
  355. Descriptions of Open Transport functions have the following format:
  356. FUNCTION    The name of the function, and a brief description.
  357. C INTERFACE    The C interface to the function.
  358. C++ INTERFACE    The C++ interface to the function.
  359. DESCRIPTION    A full description of what the function does. For functions having parameters, the description includes a table that describes which parameters are inputs and outputs to the function. Here is a key to the entries in the table:
  360. x    The parameter value is meaningful.
  361. (x)    The content of the memory pointed to by the x pointer is meaningful.
  362. ?    The parameter value is meaningful, but the parameter is optional.
  363. (?)    The content of the memory pointed to by the ? pointer is optional.
  364. /    The parameter is meaningless.
  365. =    The parameter after the call keeps the same value as before the call.
  366. VALID STATES    A list of the states that an endpoint is allowed to be in when this function is called. Refer to Appendix B for a list and descriptions of valid endpoint states.
  367. RESULT CODES    A list of result codes that the function can return. Refer to Appendix D for a list and descriptions of Open Transport result codes.
  368. SEE ALSO    A list of related functions, if any.
  369.  
  370. .c1.Introduction to Open Transport
  371. Open Transport is a set of low-overhead interfaces that will become the standard interfaces for Macintosh networking and communications. By using the Open Transport interfaces, applications (called clients) can operate in a transport-independent manner. (In Open Transport, the term transport  refers to any protocol that moves, or tranports, data.) The Open Transport client interfaces are a superset of the .i.XTI ;interface from i.X/Open; , a consortium of UNIX vendors. XTI is a superset of TLI, a UNIX standard interface. 
  372. Using the Open Transport client interface does not, by itself, ensure transport independence. Some applications are tightly coupled with a particular protocol. (For example, the current implementation of AppleShare on Macintosh computers is tightly coupled to the AppleTalk ASP protocol.) These applications often make use of particular protocol features not available in other protocols. The Open Transport Library lets such applications use all the features provided by a particular protocol through options or private interfaces. The penalty for using such protocol-specific features is, of course, that such applications are not transport independent. 
  373. The Open Transport Library uses the same option management scheme as the XTI interface, for which X/Open has already defined the options of TCP/IP, OSI, NetBIOS, and other network systems. This ensures that, even if an application is tied to a specific protocol, the application will be transportable across other implementations of the protocol, because the options have been standardized.
  374. The rest of this introduction describes the main features of Open Transport.
  375. .c2.Transport Independence
  376. One of the goals of Open Transport is to separate the evolution of AppleTalk services from the evolution of AppleTalk transport protocols. This is the keystone of Apple’s approach toward “open systems.” Clients can use transport protocol families other than AppleTalk yet still have access to AppleTalk’s superior desktop services, such as file sharing and printing. Within this framework, the main goal of Open Transport is to enable the creation of transport-independent client/server and peer-to-peer applications. For example, it should be possible to add a new networking transport protocol, such as OSI transport, and have file sharing operate over it without modification.
  377. .c2.Transport Transparency;.i.Transport Transparency;
  378. Transport transparency is similar to transport independence but goes further toward separating an application from the transport below it. Transport-independent interfaces allow applications to use similar transports interchangeably, but the application is still responsible for telling the system which protocol stack is going to be used. Transport transparency implies that the application does not choose the protocol to be used.
  379. The X/Open XTI interface uses a text string to name the desired protocol stack. An application using the XTI interface is responsible for providing the text string. Open Transport provides the same mechanism. Thus, the Open Transport interface cannot, alone, provide transport transparency, because an application must supply this information. However, when combined with a .i.Chooser/Browser; and/or .i.address book;, an application can become completely transport-transparent. When an entity is selected using a Chooser/Browser or address book, information is returned that an application just turns around and gives to the Open Transport interface. This information allows the Open Transport Library to choose or build the correct protocol stack, and the information may contain configuration settings for communicating with the selected entity.
  380. In summary, the Open Transport Library provides transport independence. When combined with a Chooser/Browser and/or address book, it will provide transport transparency.
  381. .c2.Transaction Protocols.i.Transaction Protocols;
  382. A transaction protocol is one in which a request is issued, and a response to that request is received. Most AppleTalk services (such as AppleShare, printing, and many third-party products) are based one or both of Apple’s transaction protocols (ATP and ASP). X/Open’s XTI interface, however, makes no provision for transaction protocols. For this reason, Open Transport extends XTI by adding transaction protocols. The additional functions and data structures are implemented in the same style as all of the other functions, so that the transaction extensions do not appear to be “tacked on.”
  383. .c2.Operating Environment
  384. The Open Transport Library is designed to be an appropriate interface for any underlying operating system. It does not depend on multitasking for its operation or interface, but it can take advantage of multitasking in an environment that provides it. The framework provided by the Open Transport Library for use by protocol implementations is designed to be independent of the underlying operating system. The first release of the Open Transport Library works in both 68000-family (68030 and 68040 CPU) Macintosh and PowerPC Macintosh environment s. 
  385. .c2.Client Programming Interfaces
  386. The Open Transport Library has three related client programming interfaces: XTI-style, preferred C, and preferred C++.
  387. •    XTI-style interface. The C-language XTI calls, plus some Open Transport extensions, form a group of functions referred to in this document as the “.i.XTI-style;” interfaces. These are not the preferred interfaces on the Macintosh because of the way they handle errors—through the use of a global variable. The names of these functions start with “t_” : for example, t_bind and t_accept. These functions are provided solely to ease porting of existing XTI client code.
  388. •    C functions with Macintosh conventions for names and error handling. For each XTI-style function, there is a corresponding preferredC function These functions are referred to in this document as the “.i.Preferred C;” interfaces. These functions have names like OTBind and OTAccept.
  389. •    A C++ class (TEndpoint) and its member functions. These functions are referred to in this document as the “.i.Preferred C++;” interface. For each preferredC routine, there is a corresponding member function of the TEndpoint class with the same name.
  390. The preferredC and preferredC++ interfaces have different error codes than XTI does. XTI error codes are small positive integers, but such values would be inconsistent with the rest of the Macintosh Toolbox. For the Open Transport preferred interfaces, there are a set of constants defined that map one-to-one with the XTI error constants.
  391. IMPORTANT: This document refers to Open Transport functions by their preferredC++ names, except where differentiating between C and C++ or between XTI and Open Transport.
  392. Finally, XTI defines several structures, pointers to which are used as parameters to the XTI functions. Examples of these structures are t_netbuf, t_info, t_bind, and t_call. The Open Transport preferred interfaces use structures with more Macintosh-like names such as TNetbuf, TEndpointInfo, TBind, and TCall. In general, these structures are identical to their XTI counterparts.
  393. .c2.Open Transport and Interrupt Routines
  394. Open Transport also defines many support routines that clients can use to deal with the communications environments.  These are described in the Utility routine section toward the end of this document.
  395. The Open Transport API is intended to provide high-performance communications services to client applications.  In keeping with this goal, Open Transport functions may never be called at interrupt time.  This includes any interrupt routine from an external device, VBL tasks, or Time Manager.  Open Transport functions may only be called at primary task time (also called "System Task" time, or at Deferred Task time (also called Secondary Interrupt level) scheduled by using either the Open Transport function OTScheduleDeferredTask, or by using the system _DTInstall trap.
  396. In order to support calling at primary interrupt time, Open Transport would have to be able to turn interrupts on and off to protect critical resources.  On PowerPC machines, this requires a costly mixed-mode switch.  Open Transport provides the functions OTCreateDeferredTask, OTScheduleDeferredTask, and OTDestroyDeferredTask to make it very easy for clients to defer their operations to deferred task time without using confusing paramater blocks.  Please use them.    
  397.  
  398.  
  399. .c1.Getting Started;.i.Getting Started;
  400. This section describes the main steps you must follow to create an Open Transport client in C or C++. 
  401. IMPORTANT: On Macintosh computers, the Open Transport libraries are implemented using the Apple Shared Library Manager. Thus, Open Transport clients are also clients of the Shared Library Manager, and must obey the rules of its environment. (Refer to the Apple Shared Library Manager Developer’s Guide  for more information.) 
  402. .c2.Determining if Open Transport is installed
  403. There are two ways to determine if Open Transport is present.  The first is to call InitOpenTransport.  If it returns an error, Open Transport is not present or cannot be loaded.  The second is to use the .i.Gestalt; function.  The selector for Open Transport is 'otan'.  If Gestalt returns no error and the response parameter returned is non-zero, Open Transport is installed.
  404. .c2.Using Open Transport From Stand-Alone Code
  405. If your client is a stand-alone code segment or code fragments, it must perform the following steps before calling any Open Transport functions for the first time:
  406. 1.    Include the Open Transport client header file, OpenTransport.h.
  407. 2.    Establish an A5 world.  One possible way of doing this is described in the Apple Shared Library Manager Developer’s Guide.  For code fragments, the global world is already established for you, and this step is not necessary.
  408. 3.    Call the routine .i.InitOpenTransport; Be sure to have linked with OpenTransportExtn.o (for 68K) or OpenTransportExtnPPC.o (for PowerPC).  If it returns an error, Open Transport is not available.    If you are also using the Apple Shared Library Manager, then you should make the .i.InitLibraryManager ;call prior to calling InitOpenTransport.
  409.     pascal OSStatus InitOpenTransport()
  410. After performing these steps, a standalone-code client must check that it is in its own A5 world each time it calls an Open Transport function. Finally, before exiting, a stand-alone client must call the routine .i.CloseOpenTransport;.  If you are also using the Apple Shared Library Manager, you should call .i.CleanupLibraryManager ;after calling CloseOpenTransport.
  411. .c2.Using Open Transport From Applications
  412. If your client is an application, not a stand-alone code segment or code fragment library, it must perform these steps to use the Open Transport Library:
  413. 1.    Include the Open Transport client header file, OpenTransport.h.
  414. 2.    Call the routine InitOpenTransport before calling the Open Transport Library for the first time.  Be sure to hav elinked with OpenTransportApp.o (for 68K) or OpenTransportAppPPC.o (for PowerPC).     If you are also using the Apple Shared Library Manager, then you should make the InitLibraryManager call prior to calling InitOpenTransport.
  415. 3.    (optional) Call the routine CloseOpenTransport before exiting.
  416. Unlike stand-alone code segments, applications do not need to explicitly establish an A5 world before calling the Open Transport Library nor reset their A5 world before each call to an Open Transport function - the Macintosh runtime takes care of that. 
  417. .c2.Using Open Transport From C Clients
  418. Although most Open Transport functions operate the same way, whether called from C or C++, the names of equivalent Open Transport calls differ slightly between the two languages.  The difference is that, in C, Open Transport function names have the prefix “OT”. For example, calling OTBind from C is the equivalent of calling Bind from C++. Except where differentiating between the two languages, this document omits the “OT” prefix when referring to Open Transport functions.
  419. .c2.Using Open Transport From C++ Clients
  420. An unfortunate fact of life is that different compiler vendors handle C++ dispatching differently.  The C++ objects for Open Transport (and the Apple Shared Library Manager) conform to the MPW CFront "SingleObject" dispatching convention for 68K Macintosh, and to the MPW  PPCC dispatching convention for PowerPC.  Every attempt will be made to make the header files and C++ interfaces usable by other compilers (for instance, we force pascal or _cdecl calling conventions on all of the methods of the classes to allow Symantec C++ to use our classes.  The intent of the Open Transport team is to support SOM (IBM's System Object Model)  when it becomes available.
  421.  
  422.  
  423. .c1.About Providers.i.Providers;
  424. To understand how Open Transport clients work, you must first understand providers. This section describes what providers are. 
  425. A provider is a software entity that provides some kind of data-oriented service.  That service might be implementing a networking protocol, encrypting data, filtering data, or some other data-oriented services.  Providers are implemented by modules which can be layered to provide an arbitrarily complex service for clients.  For example, an encryption module can be placed above the AppleTalk Data Stream Protocol (ADSP), which is placed above an Ethernet module.  This combination would provide a networking stream of data that was secure from "snooping" on the network.
  426. A client interfaces with a provider by means of a handle called an ProviderRef (for C++ users, this is the class TProvider).  Conceptually, a ProviderRef is similar to a file handle or a driver reference number.  It provides the association between the function called by the client and the specific provider which is to act on that function.  
  427. All providers support a basic amount of functionality.  This includes functions to make the provider synchronous or asynchronous, setting the blocking behavior, install and remove notification routines, send IOCTL commands, cancel outstanding synchronous calls, and close.
  428. Open Transport supplies several different types of providers.  A provider called a mapper (referenced by a MapperRef) provides name-to-address translation services.  A provider called an endpoint (referenced by an EndpointRef) provides a service to create connections and move data from one machine to another.  Each of these additional providers support the basic functionality, and in addition, support an additional set of functions that are unique to the type of provider.
  429. It is important to realize that references to other types of providers (e.g. EndpointRef) can be used in any function that requires a ProviderRef as a parameter.  For instance, the function OTIoctl (which allows protocol-specific commands to be sent to the communications provider) requires a ProviderRef as it's first parameter.  It is perfectly valid to pass an EndpointRef to this function (The converse is not true, however.  If a function requires an EndpointRef, never pass it a ProviderRef.  This may cause a crash!)
  430. .c2.Specifying provider services;.i.Specifying provider services;
  431. Clients invoke provider services by using an open routine to first obtain a reference to the desired provider.  This document describes two of these: OTOpenEndpoint and OTOpenMapper.  Protocol families may provide other services, with each of these other services having their own unique open routines.
  432. All open routines take a pointer to an .i.OTConfiguration ;structure as a parameter.  This structure is not defined by the Open Transport header files.  The only way to create one is to call OTCreateConfiguration (see the Utility functions section), passing it a string describing the provider service desired.
  433. In its simplest form, this string is just the name of a protocol (e.g. "ddp", "tcp", or "dnr").  Open Transport will use default rules to supply the rest of the information (which data link to use, for instance).  In its full form, this string can be a comma-separated list of provider names, with option values specified by enclosing them in parenthesis after the name of the module to which they apply. For instance,
  434. "nbp,ddp,ltlkB"
  435. describes an NBP provider layered above a DDP provider  layered on Printer port LocalTalk, and
  436. "adsp,ddp(Checksum=1),enet"
  437. describes an ADSP provider layered above a DDP provider (with checksumming turned on) layered above the default ethernet card.
  438. Open Transport  will attempt to use default rules to complete specifications that are incomplete.  For instance, the specification "adsp,enet" is incomplete, since ADSP cannot run layered directly on top of ethernet.  Open Transport understands this, and automatically puts the DDP layer between ADSP and ethernet. 
  439. The various names of providers are provided as constants in the appropriate header files for the protocol families.
  440. .c3..i.Specifying ports
  441. Open Transport provides a standard naming scheme for describing various hardware ports on a system.  Every port on the machine is described by the information in an .i.OTPortRecord ;structure:
  442.     // values for the fInfoFlags field of OTPortRecord
  443.     enum
  444.     {
  445.         kOTPortIsDLPI            = 0x00000001,
  446.         kOTPortIsTPI            = 0x00000002,
  447.         kOTPortIsNotShareable    = 0x00002000,
  448.         kOTPortIsSystemRegistered    = 0x00004000,
  449.         kOTPortIsPrivate        = 0x00008000,
  450.         kOTPortIsAlias        = 0x80000000
  451.     };
  452.     // values for the fPortFlags field of OTPortRecord
  453.     enum
  454.     {
  455.         kOTPortIsActive        = 0x00000001,
  456.         kOTPortIsDisabled        = 0x00000002,
  457.         kOTPortIsClosed        = 0x00000004
  458.     };
  459.     struct OTPortRecord
  460.     {
  461.         OTPortRef        fRef;
  462.         UInt32            fPortFlags;
  463.         UInt32            fInfoFlags;
  464.         UInt32            fCapabilities;
  465.         size_t            fNumChildPorts;
  466.         OTPortRef*        fChildPorts;
  467.         char            fPortName[kMaxProviderNameSize];
  468.         char            fModuleName[kMaxModuleNameSize];
  469.         char            fSlotID[kMaxSlotIDSize];
  470.         char            fResourceInfo[kMaxResourceInfoSize];
  471.         char            fReserved[164];
  472.     };
  473.  
  474. fRef            is a 32-bit value that is unique to this port.
  475. fPortFlags    are operational flags associated with the port.  They describe the current status of the port. 
  476. fInfoFlags    are configuration flags associated with the port.  
  477. fCapabilities    are the capability flags for the device.  These indicate what kind of framing the port can handle, or enumerate other types of capabilities by using bits in the flag.  The meaning of the bits is specific to the device type of the port.
  478. fNumChildPorts    This is the number of devices that are configured directly below this device.  Typically, this number is 0 or 1.  For instance, a "modem" device normally has a serial port device directly below it.
  479. fChildPorts    This is an array of ports containing the number of entries specific by the fNumChildPorts field.
  480. fPortName    is a zero-terminated string that is unique to this port.  This name may be used by OTCreateConfiguration to specify this port uniquely.
  481. fModuleName    is the name of the provider module that Open Transport loads.  This is not normally relevant to Open Transport clients.
  482. fSlotID    is a 0-terminated string.  It contains a string describing the slot that the port resides in.  For many devices, this string is empty, indicating that it is up to the application to determine how to identify the slot.  In the current implementation of OpenTransport, only PCI devices have a non-empty string in this field.
  483. fResourceInfo    is a 0-terminated string that describes a shared library that can handle configuration things for the device.  The full description of this field is being worked out, and will be described in a separate document.
  484. The header file OpenTransport.h defines a number of utility functions for creating and extracting information from OTPortRef values (See the Utility Functions section later in this document for a description of these functions).
  485. The header file OpenTptLinks.h contains a list of the current valid .i.device types;:
  486. enum
  487. {
  488.     kOTADEVDevice            = 1,        /* An Atalk ADEV        */
  489.     kOTMDEVDevice            = 2,        /* A TCP/IP MDEV        */
  490.     kOTLocalTalkDevice        = 3,        /* LocalTalk            */
  491.     kOTIRTalkDevice        = 4,        /* IRTalk            */
  492.     kOTTokenRingDevice        = 5,        /* Token Ring            */
  493.     kOTISDNDevice            = 6,        /* ISDN            */
  494.     kOTATMDevice            = 7,        /* ATM                */
  495.     kOTSMDSDevice            = 8,        /* SMDS            */
  496.     kOTSerialDevice        = 9,        /* Serial             */
  497.     kOTEthernetDevice        = 10,        /* Ethernet            */
  498.     kOTSLIPDevice            = 11,        /* SLIP Pseudo-device    */
  499.     kOTPPPDevice            = 12,        /* PPP Pseudo-device        */
  500.     kOTModemDevice        = 13,        /* Modem Pseudo-Device    */
  501.     kOTFastEthernetDevice    = 14,        /* 100 MB Ethernet        */
  502.     kOTFDDIDevice            = 15,        /* FDDI            */
  503.     kOTATMLANEDevice        = 16,        /* ATM LAN emulation        */
  504.     kOTATMSNAPDevice        = 17        /* ATM SNAP emulation    */
  505. };
  506. New device types should not be arbitrarily added.  Please contact Apple Computer to obtain a new, unique device type (Use the OPENTPT e-mail address mentioned on the first page of this document).
  507. With this information, a client can create OTPortRefs for many of the common hardware devices.  For instance
  508. OTPortRef ref = OTCreatePortRef(kOTNuBus, kOTEthernetDevice, 10, 0);
  509. defines the OTPortRef for an Ethernet card in slot 10 of the NuBus.  Note that slot numbers are physical; that is, they are the slot number returned by the SlotManager and NOT the slot  number that are seen in various network configuration applications.  For cards in a PCI bus, it is not possible, a priori, to create a port ref that corresponds to a know card, so applications will need to iterate through the port registry to find appropriate PCI ports.
  510. Each port on a machine has three different names associated with it: the device name, the port name, and the module name.
  511. The .i.device name ;for a port is associated with the device type of the port .  All ports on a machine that are the same device type have the same device name.. These names are defined in the header files OpenTptAppleTalk.h (for LocalTalk), OpenTptSerial.h (for serial), and OpenTptLinks.h (for all the rest).
  512. All ports on the machine also have a unique .i.port name;.  This name uniquely identifies the port without using any location information.  For instance, "ltlkA" is the unique identifier given to LocalTalk on the serial port, and "ltlkB" is the unique identifier given to LocalTalk on the modem port.   This name must always be used in the path string for OTCreateConfiguration to uniquely identify a port.
  513. The last name associated with a port is the .i.module name;.  For Open Transport clients, this name is not necessary to know.  It  is needed by Open Transport to know which provider module to load when the port is specified, and is supplied to clients for informational purposes.
  514. Open Transport allows clients to use just a device name to specify a port.  In this case, Open Transport will use the FIRST device of that type that is registered and available.  For most devices, this means the motherboard device if it exists.  Otherwise, it is the first slotted device that was registered.
  515. Open Transport provides functions to iterate through all of the ports on the machine, and determine what type of port they are (ethernet, serial, etc.), and what their names are by returning the OTPortRecord information.  See the Utility function section near the end of this document for functions which can be used to find out information about ports.
  516. .c2.Modes of Operation;.i.Modes of operation;
  517. Open Transport providers can operate in either of two modes: synchronous or asynchronous. The mode of a provider affects when calls to certain provider functions return to the calling client. 
  518. When a client calls a provider function in a synchronous mode, control does not return to the client until the function has been completed. In contrast, when a client calls a provider function in asynchronous mode , control returns to the client immediately. Later, when the function is complete, an event is sent to notify the client (NOTE: Be aware that it is possible for the notification event to be received by the client BEFORE the asynchronous function call returns to the caller). 
  519. By default, Open Transport providers operate in whatever mode they were opened in (i.e. if the provider was opened synchronously, the provider defaults to synchronous mode, otherwise it defaults to asynchronous mode). A client can, however, change the provider's mode of operation. All subsequent provider calls operate in the new mode. 
  520. .c2.Blocking;.i.Blocking;
  521. Blocking is he second attribute that a client can apply to a provider to govern how the client interacts with the provider.  In order for a provider to service a client request, the provider may be able to deal with the request immediately, or it may have to queue the request up and deal with it later.  When the provider is in non-blocking mode, if the request needs to be queued to be dealt with later, a kEAGAINErr is returned to the caller.  This allows the client the flexibility to reissue the command again later.  The non-blocking mode is more important to synchronous-mode clients, but it also can affect asynchronous-mode clients.  
  522. Blocking also affects how flow control is handled for endpoints on synchronous calls.  In blocking mode, a send request will wait for flow control to lift, then complete the send.  In non-blocking mode, if flow control is on, a kOTFlowErr or a number indicating only a partial send will be returned to the client (a T_GODATA or T_GOEXDATA event will be sent to the client when flow control lifts).
  523. When a provider is created, Open Transport defaults to non-blocking mode for all endpoints.  After that, the client has complete control over both the blocking/non-blocking and synchronous/asynchronous behavior of the provider.
  524. .c2.AckSends;.i.AckSends;
  525. Open Transport provides a mode for sending data called "AckSends".  In this mode, Open Transport does not necessarily copy the data to be transmitted.  Instead, the client is notified when the memory is no longer being used by the provider via a .i.T_MEMORYRELEASED ;event.
  526. .c2.Provider Events.i.Events;
  527. In Open Transport, as in XTI, providers communicate with clients by issuing events. Open Transport includes a set of XTI-defined .i.asynchronous events ;that signal occurrences such as the arrival of data. But XTI does not define how clients handle these events; rather, event handling is operating-system-dependent. For this reason, Open Transport provides its own mechanism for handling events. Also, because Open Transport is a superset of XTI, it defines additional asynchronous events. Open Transport further extends XTI by defining .i.completion events;, which inform a client when an asynchronous operation is finished. The names of completion events end in “COMPLETE”—for example, T_BINDCOMPLETE.
  528. To handle asynchronous events and completion events, an Open Transport client must provide a single event-handling routine that the provider can call when events occur. Optionally, the client can also continuously poll the provider for asynchronous events. (Clients cannot poll providers for completion events.) In general, the preferred method for handling all Open Transport events is to provide an event-handling routine. For more information about handling events, refer to the section “Handling Events.”
  529. .c1.Provider Functions;
  530. This section describes the provider functions that clients can call. The descriptions are grouped by task, and each group is preceded by a brief introduction. The functions are described using their Open Transport preferred-C++ names. Appendix E lists the corresponding XTI-style names.
  531. .c2.Result codes;
  532. Most Open Transport functions return an OSStatus value that indicates whether the operation succeeded or failed.
  533. For synchronous function calls, the result code indicates whether the operation succeeded or failed.  If kOTNoError is returned, the operation succeeded.   If some other value is returned, the operation failed.  The value will indicate the cause of failure.
  534. For asynchronous function calls, if the result code is kOTNoError, then the operation was successfully started.  When it completes, your notification function will be called with an event code to indicate which operation completed and a result code indicating whether the operation was successful or failed.  If an asynchronous function call returns a different value, then the operation has failed before it was started, and your notification function will not be called.
  535. In the function descriptions which follow, an attempt is made to enumerate the result codes returned by each function.  However, the list may not be complete, and a client should never assume that other result codes will not be returned.  In general, if you receive a result code you do not understand, your code should assume the worst.
  536. Also, the error code kEBADFErr is returned if the ProviderRef supplied to the function call is incorrect.  This fact is ignored in the descriptions (i.e. some function calls indicate that they return no error.  This is true if the supplied ProviderRef is valid).
  537. Every function in Open Transport can return the following result codes that are not enumerated in the function lists:
  538. kOTBadSyncErr    A synchronous call was attempted at interrupt or deferred task level, or an Open Transport call was made at primary interrupt time.  NOTE: Open Transport cannot always detect these conditions, so your code should not rely on getting this error if it calls Open Transport at the wrong time.  If this situation is undetected by Open Transport, the machine could crash.
  539. kENOMEMErr            There is not enough available memory to complete the request.
  540. kENOSRErr    There are not enough system resources to complete the request.  Typically, this means that there are no more STREAMS messages available.
  541. kEAGAINErr    An endpoint or mapper is in non-blocking mode, and Open Transport  would have to block to complete the request.  This is also referred to as the kEWOULDBLOCKErr i n the documentation (they are the same error code).
  542. kOTProtocolErr    An unspecified protocol error occurred.  This is usually fatal.  Normal recovery is to close the provider.
  543. kEBADFErr    This error can only be returned by the C interfaces.  It indicates that the ProviderRef supplied to the function was not a valid reference.
  544. kOTClientNotInittedErr    The client has not called InitOpenTransport.
  545. kOTStateChangeErr    This error normally only occurs when an asynchronous function is executed.  It is very similar to a kOTOutStateErr, but instead of indicating that the endpoint is in the wrong state, it indicates that either the state is in the process of changing, or that some function on the endpoint is currently being executed that is incompatible with the requested function.  For example, this could occur if a SndUData function is called, and before it is completed, an Unbind is issued from a deferred task routine.   It is not correct to return a kOTOutStateErr, since the endpoint is in the correct state to do an Unbind.  However, until the SndUData is complete, Open Transport cannot issue the Unbind call.
  546. .c2.Handling Events;.i.Notifiers;.i.TOTNotifier;.i.Event handling;
  547. This section describes how an Open Transport client can handle provider events. For a list and description of the events that Open Transport defines, refer to Appendix C.
  548. Note: In addition to the general events defined by Open Transport, some providers issue additional protocol-dependent events. These events are described in the documentation for each provider. Transport independent clients, however, should ignore such events. Likewise, all clients should ignore any event that they do not recognize.
  549. .c3.Using Notifier Routines;
  550. When using the Open Transport Library, the preferred way to handle events is to install a .i.notifier routine;. A notifier routine (a “notifier,” for short) is a callback routine. The Open Transport Library uses it to call back into a client, notifying the client that an event has occurred. Notifier routines are written by a client and installed on a provider after it is opened. They are also used in asynchronous Open routines.
  551. A notifier function is a ‘C’ style function with the following prototype:
  552.     pascal void NotifierRoutine(void* contextPtr, OTEventCode code,
  553.                     OTResult result, void* cookie);
  554. To install a notifier routine on an endpoint, a client calls the function OTInstallNotifier; to remove the notifier, the client calls OTRemoveNotifier. Both of these functions are described in the sections that follow. 
  555. A notifier function is of type void and has the following parameters:
  556. contextPtr    The value of this void* pointer is specified by the client when the notifier is installed. Typically, the client will use this parameter to recover some kind of context information. It could be a ProviderRef, or a pointer to a data structure that the client set up (typically, this data structure has the ProviderRef in it somewhere).
  557. code    This is the event code; it identifies what kind of event occurred. The event codes are defined in the header file OpenTransport.h.
  558. result    This parameter has no meaning for most asynchronous events. For the completion events, it contains the result code of the completed function.
  559. cookie    This parameter has different meanings depending upon the event code. For all of the standard XTI events and some of the Open Transport event extensions, this pointer has no meaning. Appendix C shows all of the Open Transport events and the meaning of the cookie parameter for each event.
  560. There is a “C” typedef for a pointer to a notification routine, .i.OTNotifyProcPtr;, that looks like:
  561.     typedef pascal void (*OTNotifyProcPtr)(void* contextPtr, OTEventCode code, 
  562.                 OTResult, void* cookie);
  563. On 68000-family Macintosh computers, restoring the A5 world in a notification routine is not necessary; it is done automatically. The value of A5 is saved when the client calls the function InstallNotifier (described later in this section) and is restored every time the notification routine is called. If your development environment uses some other register for context, then your client must save and restore this context.
  564. Note: A notification routine may be called at deferred-task time, and it may be called reentrantly. On Macintosh computers running System 7, a notification routine has all the same restrictions as any other interrupt-level callbacks, such as VBLs, Time Manager tasks, and Device Manager completion routines. An attempt is made in Open Transport to queue calls to a client’s notification routine to prevent reentrancy and keep the processor stack from growing, but this behavior is not guaranteed. Clients should be prepared and write their notification routine defensively.
  565. .c3..i.InstallNotifier;
  566. FUNCTION
  567. InstallNotifier    Give a provider a notification routine to use for notifying a client of events..i.notifier;
  568. C INTERFACE
  569. OSStatus    OTInstallNotifier(ProviderRef ref, OTNotifyProcPtr* proc, void* contextPtr);
  570. C++ INTERFACE
  571. OSStatus    TProvider::InstallNotifier(OTNotifyProcPtr* proc, void* contextPtr);
  572. Description
  573. Parameters    Before
  574. Call    After
  575. Call
  576. ref (C only)    x    /
  577. proc    x    /
  578. contextPtr    x    /
  579. notifier (C++ only)    x    /
  580. InstallNotifier gives a provider a notification routine for passing events from the provider back to the client. 
  581. In C, the ref parameter must refer to a valid provider. In C++, InstallNotifier is a member function of the TProvider class, so no explicit provider reference is required.
  582. The proc parameter is a pointer to a notification routine. This routine must be a “C” routine. If you are programming in C++, do not take the address of a member function of a class and pass that as the notification routine, unless that routine is declared static.
  583. The typedef for the proc function pointer is:
  584. typedef void (*OTNotifyProcPtr)(void* ref, OTEventCode event, OTResult err, void* cookie);
  585. The contextPtr parameter is not interpreted by the Open Transport Library; rather, it is saved internally and passed as the first parameter to the notification routine.
  586. When an event occurs, the client’s notification routine is called, and the same pointer passed to InstallNotifier is passed to the notification routine as the first parameter. The client typically will use this to hold some kind of context. The provider will not reference the data at ref nor modify it.
  587. The cookie parameter that is passed to the notification routine has a meaning that depends upon the event code. For many event codes, cookie has no meaning. For completion events such as T_REPLYCOMPLETE, where a client can have multiple outstanding occurrences of the same type of call,  cookie is used to help the client determine which particular call completed. The meaning of cookie in each context is described in each affected call’s description of asynchronous operation.
  588. If you try to install a notifier on a provider that has one already, InstallNotifier returns the error code kOTAccessErr. To remove a notification routine from a provider, call the RemoveNotifier function. 
  589. RESULT CODES
  590. kOTAccessErr
  591. See Also
  592. GetNotifier, RemoveNotifier
  593. .c3..i.RemoveNotifier;
  594. FUNCTION
  595. RemoveNotifier    Remove the notifier from a provider.
  596. C INTERFACE
  597. void    OTRemoveNotifier(ProviderRef ref);
  598. C++ INTERFACE
  599. void    TProvider::RemoveNotifier();
  600. Description
  601. Parameters    Before
  602. Call    After
  603. Call
  604. ref (C only)    x    /
  605. RemoveNotifier removes the notification routine currently installed on the specified endpoint. If no notifier is installed, this function does nothing. 
  606. The parameter ref specifies the endpoint whose notification routine is to be removed. 
  607. RESULT CODES
  608. none
  609. See Also
  610. GetNotifier, InstallNotifier
  611. .c2.Setting the Mode of Operation;.i.Mode of operation;.i.Setting;
  612. At creation, providers operate in the mode they were created in (i.e. If the provider was opened synchronously, it will be in synchronous mode.  If it was opened asynchronously, it will be in asynchronous mode). Clients can find out the current mode of a provider and set it by using the routines described in this section.
  613. .c3..i.SetSynchronous;
  614. FUNCTION
  615. SetSynchronous    Place a provider into synchronous mode.
  616. C INTERFACE
  617. OSStatus    OTSetSynchronous(ProviderRef ref);
  618. C++ INTERFACE
  619. OSStatus    TProvider::SetSynchronous();
  620. Description
  621. Parameters    Before
  622. Call    After
  623. Call
  624. ref (C only)    x    /
  625. SetSynchronous sets the operational mode of the provider to synchronous.  To find out whether an endpoint is synchronous, use the function IsSynchronous. 
  626. This call can be made at any time and will always succeed.
  627. RESULT CODES
  628. None
  629. See Also
  630. IsNonBlocking, SetBlocking, SetNonBlocking, SetAsynchronous, IsSynchronous, OpenEndpoint, AsyncOpenEndpoint, OpenMapper, AsyncOpenMapper
  631. .c3..i.SetAsynchronous;
  632. FUNCTION
  633. SetAsynchronous    Place a provider into asynchronous mode.
  634. C INTERFACE
  635. OSStatus    OTSetAsynchronous(ProviderRef ref);
  636. C++ INTERFACE
  637. OSStatus    TProvider::SetAsynchronous();
  638. Description
  639. Parameters    Before
  640. Call    After
  641. Call
  642. ref (C only)    x    /
  643. SetAsynchronous sets the operational mode of the endpoint to asynchronous. To find out whether an endpoint is asynchronous, use the function IsSynchronous. 
  644. This call can be made at any time and will always succeed.
  645. RESULT CODES
  646. None
  647. See Also
  648. IsNonBlocking, SetBlocking, SetNonBlocking, SetSynchronous, IsSynchronous, OpenEndpoint, AsyncOpenEndpoint, OpenMapper, AsyncOpenMapper
  649. .c3..i.IsSynchronous;
  650. FUNCTION
  651. IsSynchronous    Determine if a provider is in the synchronous mode of operation.
  652. C INTERFACE
  653. Boolean    OTIsSynchronous(ProviderRef ref);
  654. C++ INTERFACE
  655. Boolean    TProvider::IsSynchronous();
  656. Description
  657. Parameters    Before
  658. Call    After
  659. Call
  660. ref (C only)    x    /
  661. IsSynchronous returns true if the endpoint is in synchronous mode, or returns false if it is in asynchronous mode.
  662. RESULT CODES
  663. None
  664. See Also
  665. IsNonBlocking, SetBlocking, SetNonBlocking, SetAsynchronous, SetSynchronous, OpenEndpoint, AsyncOpenEndpoint, OpenMapper, AsyncOpenMapper
  666.  
  667. .c2.Controlling Operations on a Provider;
  668. This section describes .i.provider ;functions which can be used by clients to control operations on providers.
  669. .c3..i.OTCloseProvider;
  670. FUNCTION
  671. CloseProvider    Close and delete a provider when it is no longer needed.
  672. C INTERFACE
  673. OSStatus    OTCloseProvider(ProviderRef ref);
  674. C++ INTERFACE
  675. OSStatus    TProvider::Close();
  676. Description
  677. Parameters    Before
  678. Call    After
  679. Call
  680. ref (C only)    x    /
  681. CloseProvider closes a provider when it is no longer needed.  The CloseProvider call is always synchronous to the caller, but asynchronous in operation.  When the call returns, if no error occurred the ProviderRef is no longer valid and should not be used.  
  682. CloseProvider may be called at any time (except at primary interrupt level, of course).  However, if there are outstanding asynchronous calls, they will never complete, so be prepared for this.  Any outstanding synchronous call will be completed with a result code of kOTCanceledErr.  
  683. The blocking/non-blocking status of the provider also governs what happens when the provider is closed.  In non-blocking mode, closing the provider will flush all  outgoing commands in the stream, and immediately close the provider.  In blocking-mode, the stream will be given up to 15 seconds per module to allow outgoing commands and data to be processed, then the stream will be closed.  However, as far as the caller is concerned, the provider is closed immediately.
  684.  
  685. RESULT CODES
  686. None
  687. See Also
  688. OpenEndpoint, AsyncOpenEndpoint, OpenMapper, AsyncOpenMapper, AckSends, SetBlocking, SetNonBlocking
  689. .c3..i.SetBlocking;
  690. FUNCTION
  691. SetBlocking    Block (wait) for completion of outstanding I/O requests on a provider.
  692. C INTERFACE
  693. OSStatus    OTSetBlocking(ProviderRef ref);
  694. C++ INTERFACE
  695. OSStatus    TProvider::SetBlocking();
  696. Description
  697. Parameters    Before
  698. Call    After
  699. Call
  700. ref (C only)    x    /
  701. SetBlocking governs how I/O requests proceed over the specified provider.
  702. After a client calls SetBlocking, input requests on the specified provider do not complete unless they are satisfied. For example, if the client issues a Connect request in blocking mode,  the Connect will complete even if there is contention for resources.  However, in non-blocking mode, if there is contention for a STREAMS resource, the command will complete with a kEAGAINErr, and the command needs to be reissued again later when there is no contention.  For example, if the client issues an asynchronous IOCTL command that is not yet complete, and then issues a Connect command,  there will be contention for the stream head, since the stream head is locked until the IOCTL command completes.  In blocking mode, the Connect command will be queued to run when the IOCTL completes.  In non-blocking mode, the Connect will fail with a kEAGAINErr.
  703. However, commands that read data from the endpoint (like Rcv, RcvUData, etc.)  will only block waiting for data in synchronous/blocking mode.   All other modes will return a kOTNoDataErr error if no data is available, or a kOTEAGAINErr if the command cannot be completed without blocking.  
  704. The blocking/non-blocking status of the provider also governs what happens when the provider is closed.  In non-blocking mode, closing the provider will flush all  outgoing commands in the stream, and immediately close the provider.  In blocking-mode, the stream will be given up to 15 seconds per module to allow outgoing commands to be processed, then the stream will be closed.
  705. At creation, all providers are set by default to non-blocking mode.
  706. This call will always succeed.
  707. RESULT CODES
  708. None
  709. See Also
  710. SetNonBlocking, IsNonBlocking, SetSynchronous, SetAsynchronous IsSynchronous, OpenEndpoint, AsyncOpenEndpoint, OpenMapper, AsyncOpenMapper, CloseProvider
  711. .c3..i.SetNonBlocking;
  712. FUNCTION
  713. SetNonBlocking    Do not block (wait) for completion of outstanding I/O requests on a provider.
  714. C INTERFACE
  715. OSStatus    OTSetNonBlocking(ProviderRef ref);
  716. C++ INTERFACE
  717. OSStatus    TProvider::SetNonBlocking();
  718. Description
  719. Parameters    Before
  720. Call    After
  721. Call
  722. ref (C only)    x    /
  723. Like SetBlocking, SetNonBlocking governs how I/O requests proceed over the specified provider.   See the description for SetBlocking for details.
  724. At creation, all providers are set by default to non-blocking mode.
  725. This call will always succeed.
  726. RESULT CODES
  727. None
  728. See Also
  729. SetBlocking, IsNonBlocking, SetSynchronous, SetAsynchronous IsSynchronous, OpenEndpoint, AsyncOpenEndpoint, OpenMapper, AsyncOpenMapper
  730. .c3..i.IsNonBlocking;
  731. FUNCTION
  732. IsNonBlocking    Return the current blocking status of a provider.
  733. C INTERFACE
  734. Boolean    OTIsNonBlocking(ProviderRef ref);
  735. C++ INTERFACE
  736. Boolean    TProvider::IsNonBlocking();
  737. Description
  738. Parameters    Before
  739. Call    After
  740. Call
  741. ref (C only)    x    /
  742. IsNonBlocking returns true if the specified provider is non-blocking, or returns false if the provider is blocking. 
  743. RESULT CODES
  744. none
  745. See Also
  746. SetNonBlocking, SetBlocking, SetSynchronous, SetAsynchronous IsSynchronous, OpenEndpoint, AsyncOpenEndpoint, OpenMapper, AsyncOpenMapper
  747. .c3..i.AckSends;
  748. FUNCTION
  749. AckSends    If the provider is no longer referencing the client’s data, notify the client each time a Send operation is completed on the provider.
  750. C INTERFACE
  751. OSStatus    OTAckSends(ProviderRef ref);
  752. C++ INTERFACE
  753. OSStatus    TProvider::AckSends();
  754. Description
  755. Parameters    Before
  756. Call    After
  757. Call
  758. ref (C only)    x    /
  759. If AckSends completes successfully, the client’s event handler is called each time an operation that sends data is completed on the specified provider.  AckSends provides a way for the client to request that Open Transport not copy the client data, and provides for an acknowledgment to be delivered to the client via the notification routine when the provider is finished with the data.
  760. The client will receive a T_MEMORYRELEASED event in the notification routine.  The cookie parameter will point to the buffer that was sent and the result parameter will be set to its length.  Until the T_MEMORYRELEASED event is received, the client should refrain from changing the contents of the buffer, or the results will be unpredictable.
  761. NOTE: AckSends will return a kOTAccessErr if a notifier is not installed on the provider.  It will return a kOTStateChangeErr if a write-type operation is currently outstanding on the provider (Snd, SndUData, SndUReply, SndURequest, SndReply, or SndRequest).
  762. In addition, using AckSends makes it dangerous to close a provider until all outstanding calls on the provider are completed.  Otherwise,  the application might quit, leaving Open Transport using memory that is no longer valid, with unpredictable results.
  763. The endpoint functions that initiate Send operations are Snd, SndRequest, SndReply, SndURequest, SndUReply, SndUData, and, if the call has associated data, Connect and Accept. 
  764. By default, the Open Transport Library does not acknowledge the completion of Send operations.
  765. WARNING: Do NOT wait for a T_MEMORYRELEASED event from a previous Send operation to trigger more sends.  When a T_MEMORYRELEASED event occurs depends on how the underlying provider is implemented.  It may hold on to memory until the next send occurs, or have some other functionality which causes it to delay releasing memory.
  766. RESULT CODES
  767. kOTStateChangeErr
  768. See Also
  769. DontAckSends, IsAckingSends, CloseProvider
  770. .c3..i.DontAckSends;
  771. FUNCTION
  772. DontAckSends    Do not notify the client when function calls that send data are completed on this provider.
  773. C INTERFACE
  774. OSStatus    OTDontAckSends(ProviderRef ref);
  775. C++ INTERFACE
  776. OSStatus    TProvider::DontAckSends();
  777. Description
  778. Parameters    Before
  779. Call    After
  780. Call
  781. ref (C only)    x    /
  782. If DontAckSends completes successfully, the client’s notification routine is no longer called when Send operations are completed on the specified endpoint. Instead, when the client calls a function that sends client data, the Open Transport Library copies the data into internal buffers, and the function returns immediately to the client.  Thus, the client can immediately reuse the data area without affecting the Send operation, even if it is still in progress.
  783. The endpoint functions that send data are Snd, SndRequest, SndReply, SndURequest, SndUReply, SndUData, and, only if the call has associated data, Connect and Accept. 
  784. NOTE: DontAckSends will return a kOTStateChangeErr if a write-type operation is currently outstanding on the provider (Snd, SndUData, SndUReply, SndURequest, SndReply, or SndRequest).
  785. By default, the Open Transport Library does not acknowledge the completion of Send operations.
  786. RESULT CODES
  787. kOTStateChangeErr
  788. See Also
  789. AckSends, IsAckingSends
  790. ..c3..i.IsAckingSends;
  791. FUNCTION
  792. IsAckingSends    Return the current status of acking sends.
  793. C INTERFACE
  794. Boolean    OTIsAckingSends(ProviderRef ref);
  795. C++ INTERFACE
  796. Boolean    TProvider::IsAckingSends();
  797. Description
  798. Parameters    Before
  799. Call    After
  800. Call
  801. ref (C only)    x    /
  802. IsAckingSends returns true if the specified provider is acking sends, or returns false if the provider is not acking Sends. 
  803. RESULT CODES
  804. none
  805. See Also
  806. AckSends, DontAckSends
  807. c3..i.Ioctl;
  808. FUNCTION
  809. Ioctl    Send a provider-specific command.
  810. C INTERFACE
  811. OTResult    OTIoctl(ProviderRef ref, UInt32 cmd, void* data);
  812. C++ INTERFACE
  813. OTResult    TProvider::Ioctl(UInt32 cmd, void* data);
  814. Description
  815. Parameters    Before
  816. Call    After
  817. Call
  818. ref (C only)    x    /
  819. cmd    x    /
  820. data    x    (?)
  821. The Ioctl function allows commands to be sent to a provider that are provider specific.  The cmd and data parameters are documented with the provider that implements the commands.  In some cases the data parameter is interpreted as a pointer, and sometimes it is just interpreted as a bit pattern.
  822. In all cases, the return value of the Ioctl function (or the result parameter of a kStreamIoctlEvent, which is what you receive if the Ioctl is executed asynchronously) is zero or a positive number if no error occurred, and is one of the negative result codes if an error occurred.
  823. RESULT CODES
  824. Return codes are provider and cmd parameter specific
  825. See Also
  826.  
  827. c3..i.CancelSynchronousCalls;
  828. FUNCTION
  829. CancelSynchronousCalls    Cancel any pending synchronous call on a provider.
  830. C INTERFACE
  831. OSStatus    OTCancelSynchronousCalls(ProviderRef ref, OSStatus err);
  832. C++ INTERFACE
  833. OSStatus    TProvider::CancelSynchronousCalls(OSStatus err);
  834. Description
  835. Parameters    Before
  836. Call    After
  837. Call
  838. ref (C only)    x    /
  839. err    /    x
  840. CancelSynchronousCalls cancels, or breaks out of, a synchronous call.   The error code returned to the synchronous caller will be the "err" value supplied (typically kOTCanceledErr). A client will typically issue this call as the result of some timer process.  However, be aware that making this call may cause a provider to be unusable.  Typically, once this call is made, the only thing you can do with the provider is close it.
  841. RESULT CODES
  842. no specific result codes
  843. See Also
  844. SetSynchronous, IsSynchronous
  845. .c3..i.TransferOwnership;
  846. FUNCTION
  847. TransferOwnership    Transfer the ownership of a provider to the current Open Transport client.
  848. C INTERFACE
  849. ProviderRef    OTTransferProviderOwnership(ProviderRef ref, OSStatus* errPtr);
  850. C++ INTERFACE
  851. ProviderRef    TProvider::TransferOwnership(OSStatus* errPtr);
  852. Description
  853. Parameters    Before
  854. Call    After
  855. Call
  856. ref (C only)    x    /
  857. errPtr    x    (x)
  858. TransferOwnership transfers the ownership of a provider from whoever created the provider to the current Open Transport client.
  859. It is necessary to use this call whenever some other entity (typically a shared library) opened an endpoint on behalf of the client.  This is especially important if the entity that opened the endpoint is in a different architecture (PowerPC native vs. 68K emulated) than the client that will be using the provider.
  860. Under Open Transport, a provider allocates a small amount of memory (currently 4 bytes) from the client for the endpoint.  In addition, Open Transport automatically cleans up behind clients that  call  CloseOpenTransport.  If a shared library creates a provider on your behalf, and that shared library subsequently unloads while you are still using the provider, two bad things happen.  The memory for the provider is no longer valid, and the provider is closed out from underneath you.  Using the TransferOwnership API, ownership is changed to the calling client.  This means a new "ProviderRef" will be allocated in the calling client's memory pool, and the provider will be marked as belonging to the calling client.
  861. As long as the entity that created the provider remains loaded, and is in the same architecture as the client using the provider, no damage will be done by not making this call.  However, if the provider was created under a different architecture than the client using the provider, attempting to close the provider will cause a crash.  It is vital that if you do not use the TransferOwnership API the provider be closed under the same architecture that opened the provider.  In addition, when installing a notifier into the provider, Open Transport always assumes that the OTNotifyProcPtr is in the same architecture as the call is being made, so after transferring ownership, you may want to remove any notifier that is installed and install your own, unless your architecture is such that a cross-architecture notifier is what you want.
  862. RESULT CODES
  863. kENOMEMErr
  864.  
  865. .c1.About Endpoints.i.Endpoint;
  866. The next concept to understand is the endpoint. This section describes what endpoints are, explains how they are created, and lists the kinds of endpoints.
  867. An endpoint is a type of provider which specifies the communication path between a transport user (the client) and a specific transport provider. A .i.transport provider ;is the actual code that provides the service of moving data. All requests to the transport provider must pass through an endpoint. A single endpoint can support only one established transport connection at a time; however, one transport provider may have several endpoints as clients.
  868. A client creates an endpoint by calling the function OTOpenEndpoint, which returns an identifier to the newly created endpoint (called an EndpointRef). The client uses this identifier when making function calls to the endpoint. For example, a client must pass the identifier as the first parameter to any XTI-compatible functions of the Open Transport Library, thereby specifying which endpoint is to service the function call. When finished with an endpoint, a client calls the OTCloseProvider function, which destroys the endpoint and releases any associated system resources, such as memory.
  869. c2.Endpoint Types
  870. The XTI specification defines two kinds of data-stream endpoints:
  871. •    Connectionless datagram.i.Datagram:connectionless; 
  872. •    Connection-oriented stream.i.Stream:connection-oriented; 
  873. Open Transport supports these two kinds of data-stream endpoints; it also extends XTI by adding two kinds of transaction endpoints:
  874. •    Connectionless transaction.i.Transaction:connectionless; 
  875. •    Connection-oriented transaction.i.Transaction:connection-oriented; 
  876. A connectionless-datagram endpoint provides datagram service. The UDP protocol of TCP/IP and the AppleTalk DDP protocol are examples of connectionless-datagram protocols.
  877. A connection-oriented stream endpoint provides data transfer between two particular endpoints. A connection must be established between the endpoints before data transfer can take place. The TCP and AppleTalk ADSP protocols are connection-oriented streams. Each of these protocols is running over a connectionless datagram (TCP runs on top of IP; ADSP runs on top of DDP). Serial connections and modem connections are also connection-oriented streams. Note that a protocol such as PPP (Point-to-Point Protocol), which is a connectionless datagram, normally runs on top of serial connection, which is a connection-oriented stream. 
  878. A transaction protocol matches incoming responses with their corresponding requests. An example of a connectionless transaction protocol is the ATP protocol in AppleTalk; the AppleTalk ASP protocol is an example of a connection-oriented transaction protocol.
  879. Both connection-oriented stream endpoints and connection-oriented transaction endpoints have a variant that supports an orderly connection tear-down feature called orderly release.i.orderly release;.    
  880. .c2.Endpoint States.i.States;
  881. All Open Transport endpoints maintain a current state, which can be determined by the endpoint’s client. Many Open Transport functions may be issued only when the endpoint is in a certain state. For example, it is not legal to send data on a connection-oriented endpoint unless there is an active connection. If a function call is issued when the endpoint state is not appropriate, an error will result (kOTOutStateErr).
  882. The following table lists and briefly describes the endpoint states. For more information about these states, refer to Appendix B.
  883. State    Meaning
  884. T_UNINIT    This endpoint has been closed and destroyed - probably by the computer going into sleep mode.
  885. T_UNBND    This endpoint is initialized, but has not yet been bound to a local protocol address.
  886. T_IDLE    This endpoint has been bound to a local protocol address and is ready for use.  If it is a connectionless endpoint, then data may be sent and received.  Connection-oriented endpoints may now issue OTConnect or OTListen requests.
  887. T_INCON    This connection-oriented endpoint has received a connection request, but the client has not yet accepted or rejected the request.
  888. T_DATAXFER    This connection-oriented endpoint has a connection established; the endpoint can now send and receive data.
  889. T_OUTCON    The client has initiated a connection request on a connection-oriented endpoint, and the connection has not yet been established.
  890. T_INREL    This connection-oriented endpoint has received an incoming request for an orderly disconnect, but the client has not yet acknowledged the release.
  891. T_OUTREL    The client has initiated an orderly disconnect, but the remote endpoint has not yet acknowledged the request.
  892. The successful completion of some Open Transport functions causes an endpoint to change state. Also, asynchronous events can cause the endpoint to change state. Because certain functions are valid only for certain states, the order in which a client is allowed to make function calls is restricted. For more information, refer to the sections “Connectionless Endpoints” and “Connection-Oriented Endpoints.”
  893. Table 1-1 shows each of the Open Transport functions that can cause an endpoint’s state to change. The center column shows the state following successful completion of the function, and the right column shows the state if the function is completed with an error. (For descriptions of these functions, refer to the section “Endpoint Functions.”)
  894. Table 1-1. Open Transport functions that can change an endpoint’s state
  895.  
  896. Function    Prior State    No Error    If Error
  897. OpenEndpoint    N/A    T_UNBND    N/A
  898. CloseProvider    Any    T_UNINIT    N/A
  899. Bind    T_UNBND    T_IDLE    T_UNBND
  900. Unbind    T_DATAXFER, T_IDLE    T_UNBND    Prior State
  901. Connect    T_IDLE    T_OUTCON    T_IDLE
  902. SndOrderlyDisconnect    T_DATAXFER    T_OUTREL    T_DATAXFER
  903. SndOrderlyDisconnect    T_INREL    T_IDLE    T_INREL
  904. RcvOrderlyDisconnect    T_DATA_FER    T_INREL    T_DATAXFER
  905. RcvOrderlyDisconnect    T_OUTREL    T_IDLE    T_OUTREL
  906. SndDisconnect    T_OUTCON, T_INCON, T_DATAXFER, T_OUTREL, T_INREL    T_IDLE    Prior State
  907. RcvConnect    T_OUTCON    T_DATAXFER    T_IDLE
  908. Accept    T_INCON    T_DATAXFER    T_IDLE or T_INCON 
  909.  
  910. Table 1-2 shows each of the Open Transport asynchronous events that can cause an endpoint’s state to change. (For more information about these events, refer to Appendix C.)
  911. Table 1-2. Open Transport asynchronous events that can change an endpoint’s state
  912.  
  913. Event    New State
  914. T_LISTEN    T_INCON
  915. T_CONNECT    T_DATAXFER
  916. T_PASSCON    T_DATAXFER
  917. T_DISCONNECT    T_IDLE
  918. T_ORDREL    T_INREL
  919.  
  920. .c2.Connectionless Endpoints
  921. Endpoints are either connectionless or connection-oriented. This section gives an overview of how a client uses a connectionless endpoint. The information in this section applies to both kinds of connectionless endpoints: connectionless datagram and connectionless transaction. 
  922. When a client creates an endpoint, by calling OTOpenEndpoint, the endpoint is inthe state T_UNBND. The client must then use the Bind function to assign a local protocol address to the endpoint. A client can let the endpoint assign the protocol address, or the client can request a specific protocol address. Only one connectionless endpoint can be bound to a single protocol address. 
  923. After binding, the endpoint’s state changes to T_IDLE. The endpoint can then receive any incoming unit data or unit requests. The client can read incoming data or requests by calling the function RcvUData or RcvURequest, depending on the type of endpoint (connectionless datagram or connectionless transaction, respectively). The client can send data or requests by calling the function SndUData or SndURequest.
  924. To return the endpoint to the T_UNBND state, the client uses the Unbind function. Unbind causes all protocol activity on the endpoint to stop. The client can then bind the endpoint again and reuse it, or can destroy it by calling the CloseProvider function.
  925. 
  926. .i.Figure:State Diagram;Simplified State Diagram for a Connectionless Endpoint
  927.  
  928. .c2.Connection-Oriented Endpoints
  929. This section gives an overview of how a client uses a connection-oriented endpoint. The information in this section applies to both kinds of connection-oriented endpoints: connection-oriented stream and connection-oriented transaction.
  930. When a client creates an endpoint, by calling OpenEndpoint, the endpoint is inthe state T_UNBND. The client must then use the Bind function to assign a local protocol address to the endpoint. A client can let the endpoint assign the protocol address, or the client can request a specific protocol address. 
  931. The client must use the Bind function to assign a local protocol address to the endpoint. For example, in the case of an AppleTalk ADSP endpoint, binding means assigning a DDP socket number to the endpoint. For all endpoints, a client may allow the endpoint to assign the protocol address, or the client may ask for a specific protocol address. For connection-oriented endpoints, it is possible for several endpoints to be bound to the same protocol address. However, only one of these endpoints may be designated to receive incoming connection requests. Because connections can be accepted on a different endpoint from the one that received the connection request, it is possible to have many open sessions (on different endpoints) sharing the same protocol address.
  932. After binding, the endpoint’s state changes to T_IDLE. The endpoint is then ready to receive any incoming connection requests, or to initiating an outgoing connection request.
  933. The following figure shows the progression of states for a connection-oriented endpoint and shows the functions that cause the endpoint to change its state. For more information about how connection-oriented endpoints work, refer to the section “Using Connections.”
  934. 
  935. .i.Figure:State Diagram;Simplified State Diagram for a Connection-Oriented Endpoint
  936. .c3.Polling for Asynchronous Events;
  937. Clients can poll endpoints for asynchronous events but not for completion events. The client can read the most important pending asynchronous event by calling the function OTLook. The event is cleared automatically as the client performs some function call that consumes the event. For example, the T_LISTEN event that signals an incoming connection request is cleared when the client executes the Listen() function. The T_GODATA and T_GOEXDATA events are cleared by the OTLook function. For more information, refer to the description of the Look function.
  938. .c2.Using Asynchronous Mode.i.Asynchronous mode;
  939. Open Transport clients must call most networking and communications functions asynchronously, because the Macintosh Operating System has no built-in threads facility. Although clients can call some of these functions synchronously, doing so generally results in a poor user experience, as the user’s system can do nothing else while a call is in progress.
  940. A client can make Open Transport calls asynchronously by first putting the endpoint into asynchronous mode with the SetAsynchronous function. In asynchronous mode, many functions return before performing their task, and send an event to the client when the function has completed. Some of the functions are inherently synchronous and have no corresponding completion event. For example, the GetEndpointState function always returns the current endpoint state right away. If a function behaves differently in asynchronous mode, that behavior is described in the description of the function.
  941. A client that uses an endpoint in asynchronous mode must be prepared for the notifier to be called signaling a function completion before the function actually returns to the client. For example, a client could make an OTSndUReply to send a reply using an endpoint in asynchronous mode, and the client’s notification routine may be called with the T_REPLYCOMPLETE event even before the OTSndUReply function returns.
  942. A function that is asynchronous can return an error immediately, or it can return an error to the notification function.  However, only certain errors will be returned immediately.  These are: 
  943. kOTStateChangeErr    The requested command cannot be executed because an incompatible command is still outstanding.
  944. kOTOutStateErr    The requested command cannot be executed because the endpoint is not in the correct state for the command.
  945. kENOMEMErr    There is not enough memory available to begin command execution.
  946. kEINVALErr    The arguments to the command were invalid.
  947. kOTLookErr    An event has occurred which requires that it be dealt with before your command is executed.  Use the OTLook function to determine which event occurred.
  948. kOTBadAddressErr    An address parameter to the function was invalid.
  949. kOTBadOptionErr    An option parameter to the function was invalid.
  950. kOTBadDataErr    A data parameter to the function was invalid.
  951. kOTBadFlagErr    The OTFlags parameter to the function was invalid.
  952. kOTBadSequenceErr    The sequence parameter to the function was invalid.
  953. kOTNoDataErr    The command requests incoming data and none is available.
  954. kOTBadQLenErr    A Listen call was made on an endpoint that was bound with a qlen parameter of zero.
  955. kOTNotSupportedErr    The endpoint does not support the function call that was made.
  956. kOTFlowErr    The command requested data to be sent, but the endpoint is currently flow-controlled and cannot send data.
  957.  
  958. Here is a list of the Open Transport functions that operate differently in synchronous and asynchronous mode. Next to the name of each such function is the event issued when the function is completed:
  959. OptionManagement    T_OPTIONMGMTCOMPLETE
  960. Bind    T_BINDCOMPLETE
  961. Unbind    T_UNBINDCOMPLETE
  962. Accept    T_ACCEPTCOMPLETE
  963. SndRequest    T_REQUESTCOMPLETE
  964. SndReply    T_REPLYCOMPLETE
  965. SndURequest    T_REQUESTCOMPLETE
  966. SndUReply    T_REPLYCOMPLETE
  967. Disconnect    T_DISCONNECTCOMPLETE
  968. GetProtAddress    T_GETPROTADDRCOMPLETE
  969. ResolveAddress    T_RESOLVEADDRCOMPLETE
  970. Note: Open Transport asynchronous functions operate differently from the way that Macintosh device driver asynchronous functions do. Macintosh device drivers almost always return “no error” for function calls made asynchronously, and all result codes are passed to the completion routine. (The _Control trap on the Macintosh returns an immediate error in asynchronous mode only if there is an invalid control code in the parameter block or the driver refNum is invalid.) All Open Transport asynchronous functions return a result code. 
  971. Multiple Outstanding Asynchronous Calls
  972. For many of the Open Transport functions, it is possible to have several concurrent outstanding instances of a call. For example, a client can issue several OTResolveAddress calls on the asynchronous endpoint in a row. Similarly, a client can have several OTSndURequest calls pending on the same transaction oriented endpoint.
  973. When Open Transport calls the client notification routine to tell the client that a function has completed, the cookie parameter to the notification routine is used to help distinguish which instance of a call completed. For example, the OTResolveAddress function takes a pointer to a TCall structure containing the address to resolve and a pointer to a TCall to hold the resolved address. When the OTResolveAddress function completes, the address of the second TCall is passed in the cookie parameter to the notification routine along with a T_RESOLVEADDRCOMPLETE  event code. The meaning of the cookie is described in the event code section of this document.
  974. .c2.Handling Events for endpoints;.i.Event handling;
  975. Event handling for endpoints is the same as that described for providers.  There is one cautionary note to be aware of when dealing with the T_DATA, T_EXDATA, and T_REQUEST events.  These events are used by the Open Transport Library to signal the arrival of incoming data or an incoming transaction request. For efficiency, Open Transport notifies the client only once that incoming data has arrived. To read all the data, the client must repeatedly issue the consuming Open Transport function (Rcv, RcvUData, RcvRequest, or RcvURequest) until the function returns with a kOTNoDataErr error. The client does not have to issue these calls in the notification routine itself, but until the client makes the consuming calls and receives a kOTNoDataErr error, another T_DATA, T_EXDATA, or T_REQUEST event will not be issued. A client should also be prepared for being notified that data is available, but then receiving a kOTNoDataErr error when trying to read the data.
  976. One exception to this rule occurs when dealing with transaction protocols.  When the client gets a T_REPLY event , OTRcvUReply is called until a kOTNoDataErr is returned.   If this is deferred from the notification function to the foreground, the following sequence can occur:  While the client is busy reading replies in the foreground, a request arrives.  This will cause a T_REQUEST event to be generated.  If the foreground client was calling OTRcvUReply at this point in time, a kOTLookErr will be generated rather than a  kOTNoDataErr.  In this case (and the converse case for T_REQUEST events), another T_REPLY event will be generated when a new reply arrives.
  977. If we look at this operationally, the transport provider has a queue of data/commands to deliver to the client.  If the queue is empty when the data/command arrives, a notification is delivered to the client.  If the queue is not empty, then no notification is delivered to the client at the time the data/command is queued.  Instead, whenever the client reads the data/command at the head of the queue, Open Transport peeks at the next element of the queue, if it exists.  If this next element of the queue is of the same type as what was at the head of the queue, no event is generated.  If there is a difference, a new event is delivered to the client.  This new event is typically delivered to the client  just prior to returning from the function which removed the head element of the queue. 
  978. .c1.Open Transport Data Structures.i.Data structures;
  979. This section describes the general data structures and typedefs used by Open Transport clients. Routine-specific structures are covered in the descriptions of the routines that use them.
  980. Open Transport uses many typedefs to distinguish the different values used in it's routines.  This first list are typedefs that are used solely for parameter passing.  The use of these typedefs is to account for differences in the way that "C" compilers pass parameters:
  981. uchar_p        Used when passing an unsigned char parameter.
  982. ushort_p        Used when passing an unsigned short parameter.
  983. short_p        Used when passing a short parameter.
  984. char_p        Used when passing a char parameter
  985. boolean_p        Used when passing a Boolean parameter.
  986. These typedefs are all set to an equivalent data type that is 4 bytes long.
  987. The next set of typedefs are used to give better information about the parameter than just the size and signed/unsigned characteristics of the value:
  988. OTRelease    An internal typedef used by Open Transport
  989. OTTimeout    A timeout value, specified in milliseconds.
  990. OTBand    A "band" number for use when using the "raw" Streams APIs
  991. OTSequence    A sequence value used for matching transactions and connection requests.
  992. OTNameID    An ID returned by a mapper that uniquely identifies a registered name
  993. OTReason    A reason code returned from the OTRcvDisconnect function
  994. OTQLen    A qlen value passed to the OTBind function
  995. OTClient    A value that uniquely identifies an Open Transport client
  996. OTClientName    A typedef for the name of an Open Transport client
  997. OTOpenFlags    A value for the flags passed to the various Open Transport "open" routines    
  998. OTUnixErr    A positive error code corresponding to one of the Unix error codes
  999. OTXTIErr    A positive error code corresponding to one of the XTI error codes
  1000. OSStatus    A negative error code.  An OSStatus never has a signed value larger than 0.
  1001. OTResult    A value that holds either a result code or an error code.  If the value is negative, an error occurred and the value is the error code.  If the value is 0 or positive, no error occured and the value's interpretation depends on the function that was called.
  1002. OTAddressType    A value describing an address type used in Open Transport functions which require a protocol address
  1003. OTStructType    A value describing the various structures used by Open Transport, used by the OTAlloc procedure.
  1004. OTFlags    A value describing the flags used for sending and receiving data
  1005. OTEventCode    A value that indicates an Open Transport event.
  1006. OTNotifyProcPtr    A typedef for the Open Transport standard "notifier" or call-back procedure
  1007. OTXTILevel    A value that indicates the XTI level number of a protocol, used in OTOptionManagement calls
  1008. OTXTIName    A value that indicates the name of a protocol option, used in OTOptionManagement calls.
  1009. OTPortRef    A value that holds a unique identifier for an Open Transport port/driver
  1010. OTProcessProcPtr A typedef for a call-back procedure for the Open Transport scheduling functions.
  1011. OTTimeStamp    A value that holds an Open Transport time value.
  1012. Open Transport clients use several general data structures: 
  1013. .i.TNetbuf;    Refers to variable-length fields such as a protocol address, protocol options, or data. (XTI defines an identical structure, netbuf.)
  1014. .i.OTData;    A structure used to pass non-contiguous data to Open Transport functions
  1015. .i.TEndpointInfo;    Contains information about an endpoint such as its maximum data size, maximum protocol-address length, and type of service provided.
  1016. .c2..i.TNetbuf Structure
  1017. The C definition of a TNetbuf structure is:
  1018.  
  1019. struct TNetbuf
  1020. {
  1021.     UInt32 maxlen;
  1022.     UInt32 len;
  1023.     UInt8* buf;
  1024. };
  1025. The meaning of the fields in a TNetbuf structure is as follows:
  1026. maxlen    The maximum size of the buffer. The client sets this field before passing the TNetbuf to an Open Transport function, if the endpoint will return information in the buffer. If the endpoint has more information to return than fits in the TNetbuf, a kOTBufferOverflowErr error is usually returned.
  1027. len    The amount of valid data in the buffer. In Open Transport functions where the client passes data to the endpoint, the client is responsible for setting this field. (The maxlen field is usually ignored in this case.) In Open Transport functions that fill a TNetbuf supplied by the user, the endpoint sets this field in the TNetbuf to indicate how many bytes of data were actually returned.
  1028. buf    A pointer to the actual data buffer. 
  1029.     IMPORTANT: TNetbuf is just a data structure that refers to a data buffer; the TNetbuf does not actually contain the data. The client is responsible for ensuring that the buf field points to a data area.
  1030. The following diagram shows a TNetbuf structure and the data area it to which it refers.
  1031. 
  1032. .i.Figure:TNetbuf;A TNetbuf structure
  1033. .c2..i.OTData Structure
  1034. The OTData structure may be used to send non-contiguous data to certain Open Transport functions.  It is only supported in the functions Snd, SndUData, SndURequest, SndUReply, SndRequest, and SndReply.
  1035.   WARNING: This is an Apple extension, and using it will cause your program not to work if ported to other XTI/STREAMS environments.
  1036. The structure is used by Snd by passing a pointer to the OTData as the buffer parameter, and using the constant kNetbufDataIsOTData as the length.  All other functions pass the OTData as the buf field of a TNetbuf, setting the len field to kNetbufDataIsOTData.  This is only valid for the data TNetbuf.  Address and option TNetbufs are not allowed to use OTData structures.
  1037. The C definition of an OTData structure is:
  1038.  
  1039. struct OTData
  1040. {
  1041.     OTData*    fNext;
  1042.     void*    fData;
  1043.     size_t    fLen;
  1044. };
  1045. The meaning of the fields in an OTData structure is as follows:
  1046. fNext    A pointer to the next OTData in the list.  NULL for the last element in the list of data.
  1047. fData    A pointer to the actual data for this fragment.
  1048. fLen    The number of bytes in this fragment. 
  1049. .c2..i.TEndpointInfo Structure
  1050. The .i.TEndpointInfo; structure contains information about an endpoint. The declaration is:
  1051.  
  1052. struct TEndpointInfo
  1053. {
  1054.     SInt32    addr;
  1055.     SInt32    options;
  1056.     SInt32    tsdu;
  1057.     SInt32    etsdu;
  1058.     SInt32    connect;
  1059.     SInt32    discon;
  1060.     UInt32    servtype;
  1061.     UInt32    flags;
  1062. };
  1063. The meaning of the fields in TEndpointInfo is as follows:
  1064. addr    A value greater than zero indicates the maximum size of a protocol address. A value of T_INVALID indicates that the endpoint does not provide the client access to the address.
  1065. options    A value greater than zero indicates the maximum number of bytes needed to hold the protocol-specific options supported by the endpoint. A value of T_INVALID indicates that the endpoint does not support client-settable options.
  1066. tsdu    The value in this field has one of two meanings, depending upon the type of endpoint that is being interrogated. For streams (both connectionless and connection-oriented), this field has the following meaning:
  1067.     A value greater than zero indicates the maximum size of a transport service data unit (TSDU)..i.TSDU; A value of zero indicates that the endpoint does not support the concept of TSDU, although it does support the sending of a data stream with no logical boundaries preserved across a connection. A value of T_INFINITE specifies that there is no limit to the size of a TSDU. A value of T_INVALID indicates that the endpoint does not support normal data.
  1068.     For transactions (both connectionless and connection-oriented), this field has the following meaning:
  1069.     This field must be greater than zero; it indicates the maximum size of a response supported by the endpoint.
  1070. etsdu    The value in this field has one of two meanings, depending upon the type of endpoint that is being interrogated. For streams (both connectionless and connection-oriented), this field has the following meaning:
  1071.     A value greater than zero indicates the maximum size of an expedited transport service data unit (ETSDU)..i.ETSDU; A value of zero indicates that the endpoint does not support the concept of ETSDU, although it does support the sending of a data stream with no logical boundaries preserved across a connection. A value of T_INFINITE specifies that there is no limit to the size of an ETSDU. A value of T_INVALID indicates that the endpoint does not support expedited data.
  1072.     Note: The semantics of expedited data may be different for different kinds of endpoints.
  1073.     For transactions (both connectionless and connection-oriented), this field has the following meaning:
  1074.     This field must be greater than zero; it indicates the maximum size of a request supported by the endpoint.
  1075. connect    A value greater than zero indicates the maximum amount of data (in bytes) that may be associated with connection establishment functions. A value of T_INVALID indicates that the endpoint does not allow data to be sent with connection establishment.
  1076. discon    A value greater than zero indicates the maximum amount of data that may be associated with the SndDisconnect and RcvDisconnect functions. A value of T_INVALID indicates that the endpoint does not allow data to be sent with the abortive release functions.
  1077. servtype    This field specifies the service type provided by the endpoint.
  1078.     T_COTS indicates that the endpoint supports connection-oriented service but does not support orderly release, which is optional.
  1079.     T_COTS_ORD indicates that the endpoint supports a connection-oriented service with the optional orderly release.
  1080.     T_CLTS indicates that the endpoint supports a connectionless service. For this service, the etsdu, connect, and discon fields will all be T_INVALID.
  1081.     T_TRANS indicates that the endpoint supports a connection-oriented transaction service, but does not support orderly release, which is optional.
  1082.     T_TRANS_ORD indicates that the endpoint supports a connection-oriented transaction service with optional orderly release.
  1083.     T_TRANS_CLT indicates that the endpoint supports a connectionless transaction service.
  1084. flags    This is a bit field used to specify other information about the endpoint. If the T_SENDZERO bit is set in flags, this indicates that the underlying transport provider supports the sending of zero-length TSDUs.
  1085. Clients use the sizes provided in this structure to determine how large any required buffers must be to hold each piece of information. A client should never make assumptions about the size of data structures just because the client knows which endpoint it is using.
  1086.  
  1087. .c2.Opening and Closing Endpoints;
  1088. Before calling any other endpoint functions, a client must first create the endpoint by calling the function OTOpenEndpoint. This function takes one parameter, an OTConfiguration structure, which can be created using a smple ASCII string that gives the name of the endpoint. Based on this OTConfiguration structure, the Open Transport Library creates the endpoint. Typically, creating an endpoint will require that the Open Transport Library make some assumptions. For example, opening an endpoint using the value OTCreateConfiguration(“ADSP”) will cause an ADSP endpoint to be created. But an ADSP endpoint, by itself, is of no use; it requires a complete underlying protocol stack. The implementation for opening most endpoints will contain heuristics to use some default configurations. In this case, the ADSP implementation of opening an endpoint creates a DDP module running over the user’s default AppleTalk port.
  1089. When finished using an endpoint, a client must call the OTCloseProvider  function, which tears down the endpoint along with any lower-layer protocols associated with it.
  1090. OTOpenEndpoint is described on the following pages.
  1091. .c3..i.OTOpenEndpoint;
  1092. FUNCTION
  1093. OpenEndpoint    Create an .i.endpoint;.
  1094. C INTERFACE
  1095. EndpointRef    OTOpenEndpoint(OTConfiguration* config, OTOpenFlags oflag, TEndpointInfo* info, OSStatus* err)
  1096. C++ INTERFACE
  1097. None. (C++ clients should use the C interface to this function.)
  1098. Description
  1099. Parameters    Before
  1100. Call    After
  1101. Call
  1102. config    x    /
  1103. oflag    x    /
  1104. info>addr    /    x
  1105. info>options    /    x
  1106. info>tsdu    /    x
  1107. info>etsdu    /    x
  1108. info>connect    /    x
  1109. info>discon    /    x
  1110. info>servtype    /    x
  1111. info>flags    /    x
  1112. err    /    x
  1113. OTOpenEndpoint  creates an endpoint based on the supplied information, and returns a value by which the created endpoint can be identified when calling other endpoint functions. 
  1114.  The endpoint will be opened in synchronous, non-blocking mode.
  1115. The config parameter is a pointer to an OTConfiguration structure. The client cannot create one of these structures manually, but instead must use the  function OTCreateConfiguration:
  1116.     pascal OTConfiguration* OTCreateConfiguration(char* path);
  1117. This function takes a string parameter (typically the endpoint name), creates an OTConfiguration structure and returns a pointer to it to the client. The client should pass this pointer to OTOpenEndpoint. The OTOpenEndpoint function will destroy the structure. An example of calling OTOpenEndpoint using this function is shown below:
  1118. TEndpoint info;
  1119. OSStatus err;
  1120. EndpointRef ep = OTOpenEndpoint(OTCreateConfiguration(“ddp”), 0, &info, &err);
  1121. The parameter oflag is not currently used and should be set to zero.
  1122. OTOpenEndpoint also returns several default characteristics of the endpoint in the info parameter, which is of type TEndpointInfo. Clients use the sizes provided in this structure to determine how large any required buffers must be to hold each piece of information. A client should never make assumptions about the size of data structures just because the client knows which endpoint it is using. If the info parameter is NULL, OTOpenEndpoint returns no protocol information.
  1123. Warning: The OTOpenEndpoint function destroys the OTConfiguration returned by OTCreateConfiguration.  Never attempt to use the same configuration to open multiple endpoints.  You can use the OTCloneConfiguration function to clone the configuration for this purpose.
  1124. The output parameter err points to a result code.
  1125. RESULT CODES
  1126. kOTBadFlagErr
  1127. kOTBadNameErr
  1128. kOTCanceledErr
  1129. See Also
  1130. OTAsyncOpenEndpoint, OTCloseProvider, OTCreateConfiguration, OTCloneConfiguration
  1131. .c3..i.OTAsyncOpenEndpoint;
  1132. FUNCTION
  1133. AsyncOpenEndpoint    Create an .i.endpoint; asynchronously.
  1134. C INTERFACE
  1135. OSStatus    OTAsyncOpenEndpoint(OTConfiguration* config, OTOpenFlags oflag, TEndpointInfo* info, OTNotifyProcPtr proc, void* contextPtr)
  1136. C++ INTERFACE
  1137. None. (C++ clients should use the C interface to this function.)
  1138. Description
  1139. Parameters    Before
  1140. Call    After
  1141. Call
  1142. config    x    /
  1143. oflag    x    /
  1144. info>addr    /    x
  1145. info>options    /    x
  1146. info>tsdu    /    x
  1147. info>etsdu    /    x
  1148. info>connect    /    x
  1149. info>discon    /    x
  1150. info>servtype    /    x
  1151. info>flags    /    x
  1152. proc    x    /
  1153. contextPtr    x    /
  1154. OTAsyncOpenEndpoint  creates an endpoint asynchronously, based on the supplied information.   If this function returns an error immediately, then the notification function will not be called.  If kOTNoError is returned, then the notification function will be called with the results of the open.
  1155. The config, oflag, and info parameters have the same meaning as for OTOpenEndpoint.
  1156. When the open is complete, your notification function will be called with the event parameter set to T_OPENCOMPLETE.  The result parameter will either be kOTNoError if the open was successful, or will return a result code describing the error.  If the open was successful, the cookie is  the EndpointRef for the endpoint that was opened.
  1157. The endpoint will be opened in asynchronous, non-blocking mode, and will already have a notification routine installed, which is the same notification routine used for the open.  If you want a different notifier installed, use OTRemoveNotifier to remove the current one, and use OTInstallNotifier to install a new one.
  1158. Warning: The OTAsyncOpenEndpoint function destroys the OTConfiguration returned by OTCreateConfiguration.  Never attempt to use the same configuration to open multiple endpoints.  You can use the OTCloneConfiguration function to clone the configuration for this purpose.
  1159. RESULT CODES
  1160. kOTBadFlagErr
  1161. kOTBadNameErr
  1162. kOTCanceledErr
  1163. See Also
  1164. OpenEndpoint, CloseProvider, OTCreateConfiguration, OTCloneConfiguration
  1165.  
  1166.  
  1167. .c2.Binding and Unbinding;
  1168. Before an endpoint can be used, it must be bound to a protocol address. Binding assigns a local address to the endpoint. The client can request to bind to a particular address, or the client can let the endpoint pick its own address.
  1169. No data transfer can take place on an endpoint until it is bound. Once a connectionless endpoint is bound, it will be able to receive incoming data, and a client may send data through the endpoint. For connection-oriented endpoints, the endpoint is ready to receive incoming connection requests or make outgoing connection requests.
  1170. An endpoint can be bound and unbound multiple times without closing the endpoint in between.
  1171. .c3..i.Bind;
  1172. FUNCTION
  1173. Bind    Bind an address to an endpoint.
  1174. C INTERFACE
  1175. OSStatus    OTBind(EndpointRef ref, TBind* req, TBind* ret);
  1176. C++ INTERFACE
  1177. OSStatus    TEndpoint::Bind(TBind* req, TBind* ret);
  1178. Description
  1179. Parameters    Before
  1180. Call    After
  1181. Call
  1182. ref (C only)    x    /
  1183. req>addr.maxlen    /    /
  1184. req>addr.len    x >= 0    /
  1185. req>addr.buf    (x)    /
  1186. req>qlen    x >= 0    /
  1187. ret>addr.maxlen    x    /
  1188. ret>addr.len    /    x
  1189. ret>addr.buf    ?    (?)
  1190. ret>qlen    /    x >= 0
  1191. Bind associates a local protocol address with the endpoint specified by the parameter ref. Most endpoint functions complete successfully only if the endpoint you specify is currently bound. For instance, a connectionless endpoint can send and receive data only if the endpoint is bound. Similarly, a connection-oriented endpoint can enqueue incoming connect indications, and its client can initiate a connection, only if the endpoint is bound.
  1192. The parameter req is a TBind structure, which has the following fields:
  1193.     struct TNetbuf addr;
  1194.     OTQLen qlen;
  1195. The parameter req is used to request the address given in the req.addr field of the TBind structure. Some endpoints treat the requested address as a suggestion or hint; the actual address that they bind to an endpoint may differ from the requested address. When the Bind function returns, the TBind structure to which the ret parameter points contains the address actually bound to the endpoint. The ret>addr.len field will contain the length of the address. If the ret>addr.maxlen field indicates the TNetbuf is not large enough to contain the address, an error (kOTBufferOverflowErr) will result.
  1196. The qlen field has meaning only when initializing a connection-oriented service. It specifies the number of outstanding connect indications that the endpoint should support. A outstanding connect indication is one that has been passed to the client but which has been neither accepted (via Accept) nor rejected (via SndDisconnect). A value of qlen greater than zero is meaningful only when Bind is issued by a passive client that expects other clients to connect to it. The value of qlen will be negotiated by the endpoint and may be changed if the endpoint cannot support the specified number of outstanding connection indications. For connection-oriented endpoints, this value of qlen will not be negotiated to zero from a requested value greater than zero. When the Bind call returns, the negotiated value is stored in the qlen field of the TBind structure specified by the ret parameter.
  1197. The ret parameter may be NULL if the client does not care what address the endpoint is bound to (or will use the OTGetProtAddress function to find out) and does not care about the negotiated value of qlen.
  1198. If the requested address is not available, an error will result (kOTAddressBusyErr) .  If no address is specified in the req parameter (req>addr.len is zero or req is NULL), the endpoint will assign an address. If the req parameter is NULL, the value for req>qlen is assumed to be zero. If the endpoint could not allocate an address, the function will fail with the kOTNoAddressErr error.
  1199. It is valid to set both req and ret to NULL for the same call.
  1200. A client must not bind multiple protocol address to a single endpoint. (However, some connection-oriented endpoints let a client bind multiple endpoints to a single protocol address. ) If a client binds more than one endpoint to the same protocol address, only one endpoint can be used to listen for connection indications for that address. In other words, only one Bind for a given protocol address may specify a qlen greater than zero. 
  1201. If a client attempts to bind a protocol address to another endpoint using a qlen greater than zero, Bind will return the kOTAddressBusyErr error. When a client accepts a connection on the endpoint that is being used as the listening endpoint, the bound protocol address is busy for the duration of the connection, until an OTUnbind or OTCloseProvider call is issued. No other endpoints may be bound for listening on that same protocol address while the initial endpoint is active (either in the T_IDLE or T_DATAXFER states). This will prevent more than one endpoint bound to the same protocol address from accepting connect indications.
  1202. If the endpoint is connectionless, only one endpoint may be associated with a protocol address. If a client attempts to bind a second endpoint to an already bound protocol address, Bind will return the kOTAddressBusyErr error.
  1203. If the endpoint is in synchronous mode, the function will not return until the bind is complete.
  1204. If the endpoint is in asynchronous mode, a notification routine has been installed, and the Bind function returns kOTNoError, a T_BINDCOMPLETE event will be issued when the bind completes.  The result parameter will be kOTNoError if the bind completed successfully.  Otherwise, it will contain a result code describing the reason that the bind failed.  The cookie parameter passed to the notification routine holds the ret parameter.
  1205. If a notification routine has not been installed, the only way to determine that the bind has completed is to poll the GetEndpointState function.  This function will return a kOTStateChangeErr until the bind completes.  When the bind completes, the state will either be T_UNBND if the bind failed, or T_IDLE if it succeeded.  If the bind failed, there is no mechanism for determining the result code that it failed with.
  1206. Note: In asynchronous mode, the T_BINDCOMPLETE event may be issued before the Bind function returns a kOTNoError result code.
  1207. An asynchronous Bind still in progress may be canceled by issuing the Unbind function.
  1208. Caution: An endpoint may not allow an explicit binding of more than one endpoint to the same protocol address, although it allows more than one connection to be accepted for the same protocol address. To ensure portability, do not bind endpoints that are used as responding endpoints in a call to Accept, if the responding address is to be the same as the called address.
  1209. Valid States
  1210. T_UNBND
  1211. RESULT CODES
  1212. kOTAccessErr
  1213. kOTAddressBusyErr
  1214. kOTBadAddressErr
  1215. kOTBufferOverflowErr
  1216. kOTCanceledErr
  1217. kOTNoAddressErr
  1218. See Also
  1219. Unbind, GetEndpointState
  1220. .c3..i.Unbind;
  1221. FUNCTION
  1222. Unbind    Return an endpoint to the unbound state.
  1223. C INTERFACE
  1224. OSStatus    OTUnbind(EndpointRef ref);
  1225. C++ INTERFACE
  1226. OSStatus    TEndpoint::Unbind();
  1227. Description
  1228. Parameters    Before
  1229. Call    After
  1230. Call
  1231. ref (C only)    x    /
  1232. Unbind disables an endpoint previously bound by the Bind function. On completion of this call, no further data or events destined for this endpoint will be accepted. An endpoint which is disabled with the Unbind function can be enabled later by calling the Bind function.
  1233. If the endpoint is in synchronous mode, the function will wait until the unbind is completed.
  1234. If the endpoint is in asynchronous mode, a notification routine has been installed, and the Unbind function returns kOTNoError, a T_UNBINDCOMPLETE event will be issued when the unbind completes.  The result parameter will be kOTNoError if the unbind completed successfully.  Otherwise, it will contain a result code describing the reason that the unbind failed (most often it is a kOTLookErr on connectionless endpoints, usually indicating that more data has arrived.  Unfortunately, XTI defines that an Unbind will only succeed when there is no data available.  The only recourse is to either read the data and try again, or close the endpoint).  The cookie parameter passed to the notification routine has no meaning, and will be zero.
  1235. If a notification routine has not been installed, the only way to determine that the unbind has completed is to poll the GetEndpointState function.  This function will return a kOTStateChangeErr until the unbind completes.  When the unbind completes, the state will either be T_IDLE if the unbind failed, or T_UNBND if it succeeded.  If the unbind failed, there is no mechanism for determining the result code that it failed with.
  1236. Note: In asynchronous mode, it is possible for the endpoint to issue the T_UNBINDCOMPLETE event before the Unbind function returns the kOTNoError result to the client.
  1237. Valid States
  1238. T_IDLE
  1239. RESULT CODES
  1240. kOTBadReferenceErr
  1241. kOTBadSyncErr
  1242. kOTLookErr
  1243. kOTOutStateErr
  1244. See Also
  1245. Bind, GetEndpointState
  1246.  
  1247. .c2.Getting Information About an Endpoint;
  1248. This section describes the functions that clients can use to get information about a particular .i.endpoint;.
  1249. .c3..i.GetEndpointInfo;
  1250. FUNCTION
  1251. GetEndpointInfo    Return information about an endpoint.
  1252. C INTERFACE
  1253. OSStatus    OTGetEndpointInfo(EndpointRef ref, TEndpointInfo* info);
  1254. C++ INTERFACE
  1255. OSStatus    TEndpoint::GetEndpointInfo(TEndpointInfo* info);
  1256. Description
  1257. Parameters    Before
  1258. Call    After
  1259. Call
  1260. ref (C only)    x    /
  1261. info>addr    /    x
  1262. info>options    /    x
  1263. info>tsdu    /    x
  1264. info>etsdu    /    x
  1265. info>connect    /    x
  1266. info>discon    /    x
  1267. info>servtype    /    x
  1268. info>flags    /    x
  1269. GetEndpointInfo gets information about the specified endpoint. It returns this information in the parameter info, which is of type TEndpointInfo. 
  1270. If the info pointer argument to GetEndpointInfo is passed as a NULL pointer, GetEndpointInfo returns no protocol information.
  1271. If the endpoint is in asynchronous mode, a notification routine has been installed, and the GetEndpointInfo function returns kOTNoError, a T_GETINFOCOMPLETE event will be issued when the function completes.  The result parameter will be kOTNoError if the function completed successfully.  Otherwise, it will contain a result code describing the reason that the function failed.  The cookie parameter passed to the notification routine to indicate completion contains the value of the info  parameter that was passed to the original function call.
  1272. If a notification routine has not been installed, it is not possible to determine when this command is completed.
  1273. Valid States
  1274. All
  1275. RESULT CODES
  1276. no specific result codes
  1277. See Also
  1278. GetEndpointState, Sync
  1279. .c3..i.GetEndpointState;
  1280. FUNCTION
  1281. GetEndpointState    Return the current XTI state of an endpoint..i.States;
  1282. C INTERFACE
  1283. OTResult    OTGetEndpointState(EndpointRef ref);
  1284. C++ INTERFACE
  1285. OTResult    TEndpoint::GetEndpointState();
  1286. Description
  1287. Parameters    Before
  1288. Call    After
  1289. Call
  1290. ref (C only)    x    /
  1291. On successful completion, GetEndpointState returns an integer value of zero or greater, indicating the XTI state of the specified endpoint. (Endpoint states are listed and described in Appendix B.) The only error returned by this function is kOTStateChangeErr, which indicates that the state of the endpoint is currently changing.
  1292. Valid States
  1293. All 
  1294. RESULT CODES
  1295. kOTStateChangeErr
  1296. See Also
  1297. OpenEndpoint, GetEndpointInfo, Sync
  1298. .c3..i.Look;
  1299. FUNCTION
  1300. Look    Return current event flags for an endpoint.
  1301. C INTERFACE
  1302. OTResult    OTLook(EndpointRef ref);
  1303. C++ INTERFACE
  1304. OTResult    TEndpoint::Look();
  1305. Description
  1306. Parameters    Before
  1307. Call    After
  1308. Call
  1309. ref (C only)    x    /
  1310. On successful completion, Look returns an integer value of zero or greater, indicating the most important event pending on the specified endpoint.  The only error returned is the kOTStateChangeErr.
  1311. Clients can use Look  to poll for asynchronous events such as incoming data or a connection request.
  1312. Some functions return the kOTLookErr result code, indicating that the client should make the Look function call to determine why the original function aborted.
  1313. If successful, Look returns one of the event codes described in Appendix C (but not any of the event codes whose name ends in COMPLETE).
  1314. Valid States
  1315. All 
  1316. RESULT CODES
  1317. kOTStateChangeErr
  1318. See Also
  1319. InstallNotifier
  1320. .c3..i.GetProtAddress;
  1321. FUNCTION
  1322. GetProtAddress    Get the address to which the specified endpoint is bound. If the endpoint is connection-oriented and currently connected, also get the address to which it is connected.
  1323. C INTERFACE
  1324. OSStatus    OTGetProtAddress(EndpointRef ref, TBind* boundAddr, TBind* peerAddr);
  1325. C++ INTERFACE
  1326. OSStatus    TEndpoint::GetProtAddress(TBind* boundAddr, TBind* peerAddr);
  1327. Description
  1328. Parameters    Before
  1329. Call    After
  1330. Call
  1331. ref (C only)    x    /
  1332. boundAddr>addr.maxlen    x    /
  1333. boundAddr>addr.len    /    x
  1334. boundAddr>addr.buf    ?    (?)
  1335. boundAddr>qlen    /    /
  1336. peerAddr>addr.maxlen    x    /
  1337. peerAddr>addr.len    /    x
  1338. peerAddr>addr.buf    ?    (?)
  1339. peerAddr>qlen    /    /
  1340. GetProtAddress gets the local and remote protocol addresses currently associated with the endpoint. The client is responsible for initializing the TNetbuf structures in the TBind structure with buffers large enough to hold the addresses. (To find the length of the address, call the GetEndpointInfo function.)
  1341. The TBind structure has the following members:
  1342.     struct TNetbuf addr;
  1343.     OTQLen qlen;
  1344. The local address of the endpoint is returned in the boundAddr structure unless the endpoint is in the T_UNBND state. In the T_UNBND state, the boundAddr>addr.len field will be set to zero.
  1345. The remote address that the endpoint is connected to will be returned in the peerAddr structure. If the endpoint is not currently in the T_DATAXFER state or is not a connection-oriented endpoint, the peerAddr>addr.len field will be set to zero. The peerAddr pointer in the GetProtAddress function may be NULL.
  1346. If the endpoint is in asynchronous mode, a notification routine has been installed, and the GetProtAddress function returns kOTNoError, a T_GETPROTADDRCOMPLETE event will be issued when the function completes.  The result parameter will be kOTNoError if the function completed successfully.  Otherwise, it will contain a result code describing the reason that the function failed.  The cookie parameter passed to the notification routine to indicate completion contains the peerAddr, unless the peerAddr is NULL. If the peerAddr is NULL, the cookie contains the boundAddr.
  1347. If a notification routine has not been installed, it is not possible to determine when this command is completed.
  1348. Valid States
  1349. All 
  1350. RESULT CODES
  1351. kOTBufferOverflowErr
  1352. See Also
  1353. Bind, Connect, Accept
  1354. .c3..i.ResolveAddress;
  1355. FUNCTION
  1356. ResolveAddress    Resolve a protocol address.
  1357. C INTERFACE
  1358. OSStatus    OTResolveAddress(EndpointRef ref, TBind* req, TBind* ret, OTTimeout timeout);
  1359. C++ INTERFACE
  1360. OSStatus    TEndpoint::ResolveAddress(TBind* req, TBind* ret, OTTimeout timeout);
  1361. Description
  1362. Parameters    Before
  1363. Call    After
  1364. Call
  1365. ref (C only)    x    /
  1366. req>addr.maxlen    /    /
  1367. req>addr.len    x    /
  1368. req>addr.buf    (x)    /
  1369. req>qlen    /    /
  1370. ret>addr.maxlen    x    /
  1371. ret>addr.len    /    x
  1372. ret->addr.buf    ?    (?_
  1373. ret->qlen    /    /
  1374. timeout    x    /
  1375. ResolveAddress gets the lowest-layer protocol address that corresponds to the specified protocol address, within its protocol family. For example, ResolveAddress might convert a higher-layer address like "mynetwork.com" into a lower-layer address like "33.77".
  1376. The TBind structure has the following members:
  1377.     struct TNetbuf addr;
  1378.     OTQLen qlen;
  1379. If the endpoint is in asynchronous mode, a notification routine has been installed, and the ResolveAddress function returns kOTNoError, a T_RESOLVEADDRCOMPLETE event will be issued when the function completes.  The result parameter will be kOTNoError if the function completed successfully.  Otherwise, it will contain a result code describing the reason that the function failed.  The cookie parameter passed to the notification routine to indicate completion contains the ret parameter that was passed to the ResolveAddress call.
  1380. The timeout parameter indicates the maximum time in milliseconds that you want to wait for address resolution to occur.  This parameter is advisory only, and not all protocols will honor it.
  1381.  
  1382. Valid States
  1383. All except T_UNINIT
  1384. RESULT CODES
  1385. kOTBufferOverflowErr
  1386. kOTNotSupportedErr
  1387. kOTOutStateErr
  1388. kOTStateChangeErr
  1389. kOTBadAddressErr
  1390. See Also
  1391. None
  1392. .c3..i.Sync;
  1393. FUNCTION
  1394. Sync    Insures that the transport provider and client are synchronized as to state and endpoint information.
  1395. C INTERFACE
  1396. OTResult    OTSync(EndpointRef ref);
  1397. C++ INTERFACE
  1398. OTResult    TEndpoint::Sync();
  1399. Description
  1400. Parameters    Before
  1401. Call    After
  1402. Call
  1403. ref (C only)    x    /
  1404. On successful completion, Sync returns an integer value of zero or greater, corresponding to current information about the endpoint. On error, Sync returns a negative integer corresponding to a result code.
  1405. If the endpoint is in asynchronous mode, a notification routine has been installed, and the Sync function returns kOTNoError, a T_SYNCCOMPLETE event will be issued when the function completes.  The result parameter will be kOTNoError if the function completed successfully.  Otherwise, it will contain a result code describing the reason that the function failed.  The cookie parameter passed to the notification routine to indicate completion has no meaning.
  1406. If a notification routine has not been installed, it is not possible to determine when this command is completed.
  1407. It should not be necessary to call this function for Open Transport.  It is provided for backward compatibility with the XTI interfaces.
  1408. Valid States
  1409. All
  1410. RESULT CODES
  1411. no specific result codes
  1412. See Also
  1413. None
  1414.  
  1415. .c2.Allocating Structures;
  1416. Many of the structures passed as parameters to various endpoint functions contain one or more TNetbuf structures. Before a client can call these endpoint functions, the buf and maxlen fields of the TNetbuf must be initialized with a pointer to a buffer area and its length. The length of the buffer will differ for different endpoints. Thus, the client must allocate a buffer big enough to hold the desired data, but not so large that memory is needlessly wasted.
  1417. By using the GetEndpointInfo function, a client can determine the required length of buffers. The client can then allocate the buffers and initialize the data structures with pointers to the buffers and their sizes.
  1418. Two helper functions make this process easier—Alloc , which allocates a specified structure, and Free, which deallocates, or “frees,” it. The kind of structure to be allocated or freed is passed as a parameter to the functions.
  1419. IMPORTANT: Alloc and Free are provided for compatibility with XTI. In general, clients should not allocate and free structures on every call, because doing so will degrade client performance. Instead, if structures are to be passed as parameters to endpoint functions, clients can declare the structures just as they would any other variables or data structures.  This is especially important for data transfer functions.
  1420. .c3..i.Alloc;
  1421. FUNCTION
  1422. Alloc    Allocate a desired XTI data structure.
  1423. C INTERFACE
  1424. void*    OTAlloc(EndpointRef ref, OTStructType structType, UInt32 fields, OSStatus* err);
  1425. C++ INTERFACE
  1426. void*    TEndpoint::Alloc(OTStructType structType, UInt32 fields, OSStatus* err = NULL);
  1427. Description
  1428. Parameters    Before
  1429. Call    After
  1430. Call
  1431. ref (C only)    x    /
  1432. structType    x    /
  1433. fields    x    /
  1434. err    ?    (?)
  1435. Alloc allocates one of several data structures for use in subsequent calls. If successful, a pointer to the desired structure is returned. The type of structure that is allocated depends upon the structType parameter. The fields parameter indicates which substructures inside the requested structure should also be allocated.
  1436. For example, a client that wants to get the protocol address of the endpoint must use the GetProtAddress function. In order to make the call, the client must pass in a TBind structure whose addr.buf field points to a buffer large enough to hold the endpoint’s protocol address. The client must use GetEndpointInfo to find out how large an address field is required, allocate the memory, and then initialize the addr.buf and addr.maxlen fields in the TBind structure before making the call.
  1437. The Alloc function handles this work automatically; the client can just make the call:
  1438.         TBind* boundAddr = Alloc(T_BIND, T_ADDR);
  1439. Table 1-3 shows the structures that can be allocated and the corresponding value to use in the structType parameter.
  1440. Table 1-3. Valid Values for the structType parameter of Alloc and Free    
  1441. struct TBind     T_BIND
  1442. struct TOptMgmt    T_OPTMGMT
  1443. struct TCall    T_CALL
  1444. struct TDiscon    T_DIS
  1445. struct TUnitData    T_UNITDATA
  1446. struct TUDErr    T_UDERROR
  1447. struct TEndpointInfo    T_INFO
  1448. struct TReply    T_REPLYDATA
  1449. struct TRequest    T_REQUESTDATA
  1450. struct TUnitRequest    T_UNITREQUEST
  1451. struct TUnitReply    T_UNITREPLY
  1452. Each structure, except TEndpointInfo, contains at least one field of type struct TNetbuf. For each field of this type, the client may specify that the buffer for that field should be allocated also. The length of the buffer allocated will be at least as large as the appropriate size returned in the GetEndpointInfo function. The fields parameter is a bitwise-OR of the following constants and specifies which buffers to allocate:
  1453. T_ADDR    The addr field of the TBind, TCall,  TUDErr, TUnitRequest, TUnitData, or TUnitData structures. 
  1454. T_OPT    The opt field of the TOptMgmt, TCall, TUDErr,  TRequest, TReply, TUnitRequest, TUnitReply, or TUnitData structures.
  1455. T_UDATA    The udata field of the TCall, TDiscon, TUnitData, TRequest, TReply, TUnitRequest, or TUnitReply structures. The value of the udata.maxlen field depends upon the kind of structure being allocated.
  1456. T_ALL    All relevant fields of the desired structure will be allocated.
  1457. For each TNetbuf allocated, the maxlen field of the TNetbuf will be set to the length of the buffer allocated, and the len field of the TNetbuf will be set to zero. Irrelevant or unknown values passed in the fields parameter are ignored.
  1458. The length of any allocated fields will be appropriate only for this endpoint. Clients should not use the structure pointer that is returned by this function in calls to any other endpoint.
  1459. Any TNetbuf structures in the requested structure that are not allocated will have their maxlen, len, and buf fields all set to zero. 
  1460. Any field which has an infinite size defined by the TEndpointInfo will not be allocated.
  1461. Valid States
  1462. All 
  1463. RESULT CODES
  1464. kOTStructureTypeErr
  1465. kOTNotSupportedErr
  1466. See Also
  1467. Free, GetEndpointInfo
  1468. .c3..i.Free;
  1469. FUNCTION
  1470. Free    Free a structure previously allocated with the Alloc function.
  1471. C INTERFACE
  1472. OSStatus    OTFree(void* ptr, OTStructType structType);
  1473. C++ INTERFACE
  1474. OSStatus    TEndpoint::Free(void* ptr, OTStructType structType);
  1475. Description
  1476. Parameters    Before
  1477. Call    After
  1478. Call
  1479. ptr    x    /
  1480. structType    x    /
  1481. Free frees the memory a client has allocated using the Alloc function. The client must pass in the structure type in the structType parameter and a pointer to the structure in the ptr field. (For the valid values of the structType parameter, see the description of the Alloc function.)
  1482. The client is responsible for passing the structType parameter that exactly matches the type of structure being freed. The client may not change the buf field in any of the TNetbuf fields of the allocated structure before calling the Free function.
  1483. Valid States
  1484. All 
  1485. RESULT CODES
  1486. kOTStructureTypeErr
  1487. kOTNotSupportedErr
  1488. See Also
  1489. None
  1490.  
  1491. .c2.Managing Options;
  1492. Applications can be written that never deal with any options. Skipping this whole section the first time through is recommended. The most important thing to remember about options is that the use of options is completely optional. All endpoints have default values for options. 
  1493. This section describes the framework for the use of options. This framework is obligatory for all endpoints. The specific options that are legal for use with a specific endpoint are described in the documentation for each specific endpoint. General options are specified in the function description for the OptionManagement call.
  1494. .c3.Overview;
  1495. Not all transports are interchangeable, and clients that want to make use of particular feature sets of an endpoint need to have a way to access these features.
  1496. The X/Open XTI interface addresses this requirement with a process called option management. Open Transport supports the same mechanism through the OptionManagement.i.OptionManagement; function that allows the client of an endpoint to negotiate options, check for existence of certain options, retrieve the default options, and retrieve the current options. 
  1497. The format of options is specified, but the value is not. XTI has defined the value of options for many protocols in the ISO and TCP/IP protocol families. Apple and AT&T have defined options for some protocols in the AppleTalk family. The formats of these options can be found in the individual documents for the protocol families.
  1498. Free-form options and options specific to the particular kind of endpoint seem to defy one of the goals of Open Transport: that a client can interchangeably use endpoints that provide a similar type of service. There are two features of Open Transport that reduce the size of this problem: default options and configuration. All endpoints have default options that are “good enough” for most uses, so a client need not specify options when making endpoint function calls that take an option parameter.
  1499. There will be situations where use of the OptionManagement call is unavoidable, but in many cases correct design of endpoint layers can hide these calls from the application that is the ultimate user of lower endpoint. 
  1500. There are two general categories of options: those that are association-related and those that are not. Association-related options are intimately related to the particular transport connection or datagram transmission. If a calling client specifies such an option, some ancillary information is passed along to the destination endpoint in most cases. The interpretation and further processing of this information are protocol-dependent. For example, in an ISO connection-oriented communication, the calling client may specify quality-of-service parameters on connection establishment. These are processed and possibly lowered by the called endpoint, then passed along to the called (remote) client, who may degrade them again, and finally returned to the calling client.
  1501. Options that are not association-related do not contain information destined for the remote transport user. Some have purely local relevance: an option that enables debugging for example. Others influence the transmission. For example, the option for an IP endpoint that sets the time-to-live field. Local options are negotiated solely between the client and endpoint. 
  1502. The distinction between these two categories of options is visible in the Open Transport interfaces through the following relationship: On output, the functions Listen, RcvUData, and RcvURequest return association-related options only. The functions RcvConnect and RcvUDErr may return options of both categories. On input, options of both categories may be specified to the Accept, SndUData, and SndURequest functions. The functions Connect and OptionManagement can process and return both categories of options.
  1503. .c3.Portability;
  1504. An applications programmer who writes Open Transport programs faces two portability aspects:
  1505. •    Portability across different protocol families
  1506. •    Portability across different system platforms
  1507. Options are intrinsically coupled with a particular protocol or protocol family. Making explicit use of them degrades portability across protocol families.
  1508. Different system platforms may offer different option support for the same protocols due to different implementations. The lists of common options described in the OptionManagement function and the protocol-specific options described elsewhere are maximal sets but do not necessarily reflect common implementation practice. Different system platforms will implement subsets that suit their needs. Making careless use of options endangers portability across different system platforms.
  1509. Every implementation of a protocol endpoint can be used with the default values of options. This means applications can be written that do not care about options at all.
  1510. An application program that processes options retrieved from an Open Transport function should discard options it does not recognize in order to lessen its dependence on different system platforms and future expansion of protocol options and vice versa.
  1511. .c3.Option Format;
  1512. Options are passed to or from an endpoint via an opt parameter of type struct TNetbuf. Each option in the buffer pointed to by opt.buf is of the form struct TOption, possibly followed by an option value.
  1513. Several options can be concatenated, but each option must start on a long-word boundary:
  1514. 
  1515. The level field of an option identifies the XTI level (see GetXTILevel) of the endpoint, the name field identifies the option, and the len field contains the total length of the option (including the four long-words and the value fields.). The status field is used to indicate the success or failure of an option negotiation (See the OptionManagement function for a description). All four of these fields are unsigned longs.
  1516. .c3.Option Negotiation;
  1517. The discussion below describes the general rules governing the passing and retrieving of options and the error conditions that can occur. Unless explicitly restricted, these rules apply to all functions that allow the exchange of options.
  1518. .c4.Multiple Options and Options Levels;
  1519. When multiple options are specified in an option buffer on input, different rules apply to the levels that may be specified, depending upon the function call. Multiple options specified on input to the OptionManagement function must address the same option level. Options specified on input to Connect, Accept, SndUData, and SndURequest can address different levels.
  1520. .c4.Illegal Options;
  1521. Only legal options may be negotiated; illegal options cause failure. An option is illegal if the following applies:
  1522. •    The length specified in the TOption.len exceeds the remaining size of the option buffer (counted from the beginning of the option).
  1523. •    The option value is illegal. The legal values are defined for each option. (See the documentation specific to the particular endpoint.)
  1524. If an illegal option is passed to an endpoint, the following will happen:
  1525. •    A call to OptionManagement will fail with kOTBadOptionErr.
  1526. •    Accept or Connect will fail with either kOTBadOptionErr, or the connection establishment aborts, depending upon the implementation and the time the illegal option is detected. If the connection aborts, a T_DISCONNECT event occurs, and a synchronous call to Connect fails with kOTLookErr. It depends upon timing and implementation conditions whether an Accept can still succeed or whether it fails with kOTLookErr.
  1527. •    A call to SndUData either fails with kOTBadOptionErr or it successfully returns, but a T_UDERR event occurs to indicate that the datagram was sent.
  1528. If the client passes multiple options in one call and one of them is illegal, the call fails as described above. However, it is possible that some or all of the submitted legal options were successfully negotiated. The client can check the current status by calling the OptionManagement function with the T_CURRENT action flag set.
  1529. Specifying an option level unknown to an endpoint does not cause failure in calls to Connect, Accept, SndUData, or SndURequest; the option is ignored. The function OptionManagement will fail with kOTBadOptionErr if passed an unknown option level.
  1530. Specifying an option name that is unknown to or not supported by the endpoint selected by the option level does not cause failure. The option is discarded in calls to Connect, Accept, SndUData, or SndURequest. The function OptionManagement returns T_NOTSUPPORT in the level field of the option.
  1531. .c4.Initiating an Option Negotiation;
  1532. A client initiates an option negotiation when calling Connect, SndUData, SndURequest, or OptionManagement with the action flag T_NEGOTIATE set.
  1533. The negotiation rules for these functions depend on whether an option request is an absolute requirement or not..i.absolute requirement; This is explicitly defined for each option (see documentation for each specific endpoint kind). For example, in the case of an ISO endpoint, the option that requests use of expedited data is not an absolute requirement, but the option that requests protection could be an absolute requirement.
  1534. If the proposed option is an absolute requirement, three outcomes are possible:
  1535. •    The negotiated option value is the same as the proposed one. When the result of the negotiation is retrieved, the status field in the TOption structure is set to T_SUCCESS.
  1536. •    The negotiation is rejected if the option is supported, but the proposed value cannot be negotiated. This leads the following:
  1537.     – OptionManagement successfully returns, but the returned option has its status field set to T_FAILURE.
  1538.     – Any attempt to establish a connection aborts; a T_DISCONNECT event occurs, and a synchronous call to Connect fails with kOTLookErr.
  1539.     – SndUData fails with kOTLookErr or successfully returns, but a T_UDERR event occurs to indicate that the datagram was not sent.
  1540.     If multiple options are submitted in one call, and one of them is rejected, the endpoint behaves as described above. Although the connection establishment, the datagram transmission, or the transaction request fails, options successfully negotiated before some option was rejected retain their negotiated values. There is no undo mechanism.
  1541.     The function OptionManagement attempts to negotiate each option. The status fields of the returned options indicate success (T_SUCCESS) or failure (T_FAILURE).
  1542. •    If the endpoint does not support the option at all, OptionManagement reports T_NOTSUPPORT in the status field. The Connect, SndUData, and SndURequest functions ignore the option.
  1543. If the proposed option value is not an absolute requirement, two outcomes are possible:
  1544. •    The negotiated value is of equal or lesser quality than the proposed one (that is, a delay may become longer).
  1545.     When the result of the negotiation is retrieved, the status field in TOption is set to T_SUCCESS if the negotiated value equals the proposed one, or T_PARTSUCCESS otherwise.
  1546. •    If the endpoint does not support the option at all, OptionManagement reports T_NOTSUPPORT in the status field. The functions Connect, SndUData, and SndURequest ignore the option.
  1547. Unsupported options do not cause functions to fail or a connection to abort, since different implementations possibly implement different subsets of options. Future enhancements might add additional options that are unknown to earlier implementations of an endpoint. The decision whether or not the missing support of an option is acceptable is left to the client.
  1548. The endpoint does not check for multiple occurrences of the same option, possibly with different values. It simply processes the options one after another. However, the client should not make any assumption about the order of processing in case this changes in the future.
  1549. Not all options are independent of one another. A requested option value might conflict with the value of another option that was specified in the same call or is currently effective. These conflicts may not be detected at once, but later they might lead to unpredictable results. If detected at negotiation time, these conflicts are resolved within the rules stated above. The outcomes may be quite different and depend upon whether absolute or non absolute requests are involved in the conflict.
  1550. Conflicts are usually detected at the time a connection is established or a datagram is sent. If the options are negotiated with OptionManagement, conflicts are usually not detected at this time, since independent processing of the requested options must allow for temporal inconsistencies.
  1551. When called, the functions Connect, SndUData, and SndURequest initiate a negotiation of all association-related options according to the rules of this section. Options not explicitly specified in the function calls are taken from a (logical) internal option buffer containing default values, configured values, or values of a previous negotiation.
  1552. .c4.Responding to a Negotiation Proposal;
  1553. In connection-oriented communication, some protocols give the peer transport client the opportunity to negotiate characteristics of the connection to be established. These characteristics are association-related options. With the connect indication, the called client receives (via a Listen function) a proposal about the option values that should be effective for this connection. The called user can accept this proposal or weaken it by choosing values of lower quality. The called client can, of course, refuse the connection establishment altogether.
  1554. For connection-oriented endpoints, the called user responds to a negotiation proposal via Accept. If the called endpoint client tries to negotiate an option of higher quality than proposed, the outcome depends on the protocol to which that option applies. Some protocols may reject the option, some protocols take other appropriate action described in protocol-specific documentation. If an option is rejected, the following error occurs:
  1555.     The connection fails; a T_DISCONNECT event occurs. It depends on timing and implementation conditions whether the Accept call still succeeds or fails with a kOTLookErr result.
  1556. If multiple options are submitted with Accept and one of them is rejected, the connection fails as described above. Options that could be successfully negotiated before the erroneous option was detected retain their negotiated value. There is no undo mechanism.
  1557. The response options can either be specified with the Accept call, or can be preset by the responding endpoint (not the listening endpoint!) in an OptionManagement call (with the T_NEGOTIATE action flag) prior to Accept. Note that the response to a negotiation proposal is activated when Accept is called. An OptionManagement call with erroneous option values as described above will succeed; the connection aborts at the time the Accept is called.
  1558. The connection also fails if the selected option values lead to contradictions.
  1559. The function Accept does not check for multiple specifications of the same option. Unsupported options are ignored.
  1560. .c4.Retrieving Information About Options;
  1561. This section describes how a client can retrieve information about options. To be explicit, a client must be able to
  1562. •    know the result of a negotiation (i.e. at the end of a connection establishment)
  1563. •    know the proposed option values under negotiation (during connection establishment)
  1564. •    retrieve option values sent by the remote client for notification only
  1565. •    check option values currently effective for the transport endpoint
  1566. So that the client can perform these operations, the Connect, Listen, OptionManagement, RcvConnect, RcvUData, RcvUDErr, and RcvURequest functions take an output parameter opt of type struct TNetbuf. The client must specify a buffer address where the options will be written to in opt.buf, and opt.maxlen must contain the buffer’s size. The client may set opt.maxlen to zero to indicate that no options are to be retrieved.
  1567. Which options are returned depends upon the function call:
  1568. Connect (synchronous) and RcvConnect
  1569.     The function returns the values of all association-related options that were received with the connection response and the negotiated values of those non-association-related options that had been specified on input. However, options specified on input to the Connect call that are not supported, or refer to an unknown option level are discarded and not returned on output.
  1570.     The status field of each option returned with Connect or RcvConnect indicates if the proposed value (T_SUCCESS) or a degraded value (T_PARTSUCCESS) has been negotiated. The status field of received ancillary information that is not subject to negotiation is always set to T_SUCCESS.
  1571. Listen
  1572.     The received association-related options are related to the incoming connection (identified by the sequence number), not to the listening endpoint. (However, the option values currently effective for the listening endpoint can affect the values retrieved by Listen, since the endpoint might be involved in the negotiation process, too). Thus, if the same options are specified in a call to OptionManagement with the action flag set to T_CURRENT, OptionManagement will usually not return the same values.
  1573.     The number of received options may be variable for subsequent connection indications, since many association-related options are transmitted only on explicit demand by the calling client. It is even possible that no options at all are returned.
  1574. RcvUData
  1575.     The received association-related options are related to the incoming datagram, not to the endpoint. Thus, if the same options are specified in a call to OptionManagement with the action field set to T_CURRENT, OptionManagement will usually not return the same values.
  1576.     The number of options received may vary from call to call.
  1577.     The status field is irrelevant.
  1578. RcvUDErr
  1579.     The returned options are related to the options input at the previous SndUData call that produced the error. Which options are returned and which values they have depend on the specific error condition.
  1580.     The status field is irrelevant.
  1581. OptionManagement
  1582.     This call can process and return both categories of options. It acts on options related to the endpoint, not on options related to a connect indication or an incoming datagram.
  1583. .c4.Privileged and Read-Only Options;
  1584. Privileged options or option values are those that may be requested by privileged clients only. The meaning of privileged is implementation-defined.
  1585. Read-only options serve for information purposes only. The client may be allowed to read the option value but not to change it. For example, to select the value of a protocol timer or the maximum length of a protocol data unit may be too subtle to leave to the client, though the knowledge about this value may be of some interest. An option might be read-only for all clients or solely for non-privileged clients. A privileged option might be inaccessible or read-only for non-privileged users.
  1586. An option might be negotiable in some XTI states and read-only in other XTI states. For example, the ISO quality-of-service options are negotiable in the T_IDLE and T_INCON states, and read-only in all other states (except T_UNINIT).
  1587. If a client requests negotiation of a read-only option, or a non-privileged client requests illegal access to a privileged option, the following outcomes are possible:
  1588. •    OptionManagement successfully returns, but the returned option has its status field set to T_NOTSUPPORT if a privileged option was requested illegally, and T_READONLY if the modification of a read-only option was requested.
  1589. •    If negotiation of a read-only option is requested, Accept or Connect fail with kOTAccessErr, or the connection establishment aborts, and a T_DISCONNECT event occurs. If the connection aborts, a synchronous call to Connect will fail with kOTLookErr. If a privileged option is illegally requested, the option is quietly ignored.(A non-privileged client shall not be able to select an option which is privileged or unsupported.) It depends on timing and implementation conditions whether an Accept call still succeeds or fails with kOTLookErr.
  1590. •    If negotiation of a read-only option is requested, SndUData may return kOTLookErr or successfully return, but a T_UDERR event occurs to indicate that the datagram was not sent. If a privileged option is illegally requested, the option is quietly ignored. (A non-privileged client will not be able to select an option that is privileged or unsupported.)
  1591. If multiple options are submitted to Connect, Accept, SndUData, or SndURequest, and a read-only option is rejected, the connection or the transmission fails as described. Options that could be successfully negotiated before the erroneous option was discovered retain their negotiated values. There is no undo mechanism.
  1592. .c4.Option Management of a Transport Endpoint;
  1593. This section describes how option management works during the lifetime of a transport endpoint.
  1594. Each transport endpoint is (logically) associated with an internal option buffer. When a transport endpoint is created, this buffer is filled with a system default value for each supported option. Depending upon the option, the default may be “Option Enabled” or “Option Disabled” or denote a time span, etc. These default settings are appropriate for most uses. Whenever an option value is modified in the course of an option negotiation, the modified value is written to this buffer and overwrites the previous one. At any time, the buffer contains all option values that are currently effective for this endpoint.
  1595. The current value of an option can be retrieved at any time by calling OptionManagement with the T_CURRENT action flag set. Calling OptionManagement with the T_DEFAULT action flag set yields the system default for the specified option.
  1596. A transport client can negotiate new option values by calling OptionManagement with the T_NEGOTIATE action flag set. The negotiation follows the rules in a previous section, “Option Negotiation”.
  1597. Some options may be modified only in specific XTI states and are read-only in other XTI states. Many association-related options, for example, may not be changed in the state T_DATAXFER, and an attempt to do so will fail. The legal states for each option are specified in the documentation for the option.
  1598. Association-related options take effect at the time a connection is established or a datagram is transmitted. This is the case if they contain information that is transmitted across the network or they determine specific transmission characteristics. If such an option is modified by a call to OptionManagement, the endpoint checks whether the option is supported and negotiates a value according to its current knowledge. This value is written to the internal option buffer. The final negotiation takes place if the connection is established or the datagram is transmitted. This can result in a degradation of the option value or even in a negotiation failure. The negotiated values are written to the internal option buffer.
  1599. Some options may be changed in the state T_DATAXFER, for example those specifying buffer sizes. Such changes might affect the transmission characteristics and lead to unexpected side effects, such as data loss if a buffer size was shortened.
  1600. The endpoint client can explicitly specify both categories of options on input when calling Connect, Accept, SndUData, or SndURequest. The options are first locally negotiated option-by-option, and the resulting values written to the internal option buffer. The modified option buffer is then used if a further negotiation step across a connection is required. The newly negotiated values are then written to the internal option buffer.
  1601. At any stage, a negotiation failure can lead to an abort of the transmission. If a transmission aborts, the option buffer will preserve the content it had at the time the failure occurred. Options that could be negotiated just before the error occurred are retained in the option buffer whether or not the function call fails or succeeds.
  1602. It is up to the endpoint user to decide which options to specify on input when calling Connect, Accept, SndUData, or SndURequest. The client need not pass options at all by setting the len field of the functions input opt parameter to zero. The current content of the internal option buffer is then used for negotiation.
  1603. The negotiation procedure for options at the time a Connect, Accept, SndUData, or SndURequest function is made is the same as described in earlier sections whether the options are explicitly specified or are implicitly taken from the internal option buffer.
  1604. The transport client must not make assumptions about the order in which options are processed during negotiation.
  1605. A value in the option buffer is modified only as a result of successful negotiation of this option. It is not changed by a connection release. There is no history mechanism that would restore the buffer state existing prior to the connection establishment or the datagram transmission. The transport client must be aware that a connection establishment or datagram transmission may change the internal option buffer, even if each option was originally initialized to its default value.
  1606. .c3.The Option value T_UNSPEC;
  1607. Some options may not have a fully specified value all the time. When an option does not have a value, it gets the value T_UNSPEC in the status field.
  1608. An endpoint may also return the value T_UNSPEC if it cannot currently access the option value. This may happen, for example, in the state T_UNBND in systems where the protocol stack resides on a separate host. An endpoint will never return T_UNSPEC if the option is not supported at all.
  1609. If T_UNSPEC is a legal value for a specific option, it may be used by the client on input, too. It is used to indicate that it is left up to the endpoint to choose an appropriate value. This is especially useful in complex options such as ISO throughput where the option value has an internal structure. The endpoint client may leave some fields unspecified by selecting this value. If the client proposes T_UNSPEC, the endpoint is free to select an appropriate value. This might be the default value, some other explicit value, or T_UNSPEC.
  1610. The documentation for each option will specify whether or not T_UNSPEC is a legal value for negotiation purposes.
  1611. .c3.The info Argument;
  1612. The functions OpenEndpoint, AsyncOpenEndpoint, and GetEndpointInfo return values representing characteristics of the transport endpoint in their info parameter. The value of info>options is used in he Alloc function to allocate storage for an option buffer to be used in a endpoint function call. The value is sufficient for all uses.
  1613. In general, info>options also includes the size of privileged options, even if these are not read-only for non-privileged users. Alternatively, an implementation can choose to return different values in info>options for privileged and non-privileged users.
  1614. The values in info>etsdu, info>tsdu, info>connect, and info>discon possibly diminish as soon as the T_DATAXFER state is entered. Calling OptionManagement does not influence these values.
  1615. .c3.Summary;
  1616. •    The value of an option is defined by a header struct TOption, followed by an option value.
  1617. •    On input, several options can be specified in an input opt parameter. Each option must begin on a long-word boundary.
  1618. •    An endpoint is (logically) associated with an internal option buffer, where the currently effective value are stored. Each successful negotiation of an option modifies this buffer, regardless of whether the call initiating the negotiations succeeds or fails.
  1619. •    When calling Connect, Accept, SndUData, and SndURequest, the client can choose to use the current options by setting the len field of the input opt parameter to zero.
  1620. •    If a connection is accepted with the Accept function, the explicitly specified option values together with the currently effective options of the endpoint accepting the connection matter. But, only in the case where the Accept function is instructed to accept the connection on an endpoint different from the one that received the connection request.
  1621. •    The options returned by RcvUDErr are those negotiated with the outgoing datagram that produced the error. If the error occurred during the option negotiation, the returned option might represent some mixture of partly negotiated and not-yet-negotiated options.
  1622. .c3..i.OptionManagement;
  1623. FUNCTION
  1624. OptionManagement    Manage options for an endpoint.
  1625. C INTERFACE
  1626. OSStatus    OTOptionManagement(EndpointRef ref, TOptMgmt* req, TOptMgmt* ret);
  1627. C++ INTERFACE
  1628. OSStatus    TEndpoint::OptionManagement(TOptMgmt* req, TOptMgmt* ret);
  1629. Description
  1630. Parameters    Before
  1631. Call    After
  1632. Call
  1633. ref (C only)    x    /
  1634. req>opt.maxlen    /    /
  1635. req>opt.len    x >= 0    /
  1636. req>opt.buf    (x)    /
  1637. req>flags    x >= 0    /
  1638. ret>opt.maxlen    x    /
  1639. ret>opt.len    /    x
  1640. ret>opt.buf    ?    (?)
  1641. ret>flags    /    x >= 0
  1642. OptionManagement allows a client to retrieve, verify, or negotiate protocol options with the endpoint. The req and ret parameters point to TOptMgmt structures containing these members:
  1643.     struct TNetbuf opt;
  1644.     OTFlags flags;
  1645. The opt field identifies the protocol options, and the flags field is used to specify the action to take with the options.
  1646. The flags field of the req parameter is used to request a specific action of the endpoint, and the opt field is used to pass the value of the options to the endpoint.
  1647. Each option in the options buffer is of the form struct TOption possibly followed by an option value. (See the earlier section “Option Formats”.)
  1648. The level field in each struct TOption identifies the XTI level of the transport provider. The name field identifies the option within the level, and len contains the total length of the option (that is, the length of the TOption structure plus the length of the option value). If OptionManagement is called with the action T_NEGOTIATE set, the status field of the returned options contains information about the success or failure of a negotiation.
  1649. Each option in the input or output option buffer must start on a long-word boundary. A macro defined in the OpenTransport.h header file, OPT_NEXTHDR(pbuf, buflen, poption) can be used by the client for this purpose. The parameter pbuf denotes a pointer to an option buffer, opt.buf, and buflen is its length. The parameter poption points to the current option in the option buffer. OPT_NEXTHDR returns a pointer to the position of the next option or returns a null pointer if the option buffer is exhausted. The macro is helpful for both reading and writing.
  1650. If the client specifies several options on input, all options must address the same level.
  1651. If any option in the options buffer does not indication the same level as the first option, or the level specified is unsupported, then the OptionManagement request will fail with kOTBadOptionErr. If the error is detected, some options have possibly been successfully negotiated. The client can check the current status by calling OptionManagement with the T_CURRENT option flag set.
  1652. The flags field of the TOptMgmt structure pointed to by the req parameter must specify one of the following actions:
  1653. T_NEGOTIATE    This action enables the client to negotiate the values of the options with the endpoint. The endpoint will evaluate the requested options, negotiate the values, and return the resulting values in the TOptMgmt structure pointed to by the ret parameter. The status field of each returned option is set to indicate the result of the negotiation. The value is T_SUCCESS if the proposed value was negotiated, T_PARTSUCCESS if a degraded value was negotiated, T_FAILURE if the negotiation failed (according to the negotiation rules), T_NOTSUPPORT if the transport provider does not support this option or illegally requests negotiation of a privileged option, and T_READONLY if modification of a read-only option was requested. If the status is T_SUCCESS, T_FAILURE, T_NOTSUPPORT, or T_READONLY, the returned option value is the same as the one requested on input.
  1654.     On return, the overall result of the negotiation is returned in ret>flags. This field contains the worst single result; the rating from worst to best is: T_NOTSUPPORT, T_READONLY, T_FAILURE, T_PARTSUCCESS, T_SUCCESS.
  1655.     For each level, the option T_ALLOPT (see below) can be requested on input. No value is given with this option; only the TOption part is specified. This input requests to negotiate all supported options of this level to their default values. The result is returned option by option in ret>opt.buf. (Note that depending on the state of the transport endpoint, not all requests to negotiate the default value may be successful.)
  1656. T_CHECK    This action enables the client to verify whether the options specified in the req TOptMgmt structure are supported by the endpoint.
  1657.     If an option is specified with no option value (it consists only of a TOption structure), the option is returned with its status field set to T_SUCCESS if it is supported, T_NOTSUPPORT if it is not supported or needs additional client privileges, and T_READONLY if it is read-only (in the current XTI state). No option value is returned.
  1658.     If an option is specified with an option value, the status field of the returned option has the same value as if the user had tried to negotiate this value with T_NEGOTIATE. If the status is T_SUCCESS, T_FAILURE, T_NOTSUPPORT, or T_READONLY, the returned option value is the same as the one requested on input.
  1659.     The overall result of the option checks is returned in ret>flags. This field contains the single worst result of the option checks; the rating is the same as for the T_NEGOTIATE action flag.
  1660.     Note that no negotiation takes place. All currently effective options remain unchanged.
  1661. T_DEFAULT    This action enables a client to retrieve the default options supported by the endpoint. The client specifies the options of interest in req>opt.buf. The option values are irrelevant and will be ignored; it is sufficient to specify the TOption part of an option only. The default values are then returned in ret>opt.buf.
  1662.     The status field returned is T_NOTSUPPORT if the protocol level does not support this option, or the client illegally requested a privileged option, T_READONLY if the option is read-only, and T_SUCCESS in all other cases. The overall result of the request is returned in ret>flags. This field contains the single worst result; the rating is the same as for the T_NEGOTIATE flag.
  1663.     For each level, the option T_ALLOPT can be requested on input. All supported options of this level with their default values are returned. In this case, ret>opt.maxlen, must be given at least the value in info>options. (See GetEndpointInfo) before the call.
  1664. T_CURRENT    This action enables a client to retrieve the currently active options. The client specifies the options of interest in req>opt.buf. The option values are irrelevant and will be ignored; it is sufficient to specify the TOption part of an option only. The current values are then returned in ret>opt.buf.
  1665.     The status field returned is T_NOTSUPPORT if the protocol level does not support this option, or the client illegally requested a privileged option, T_READONLY if the option is read-only, and T_SUCCESS in all other cases. The overall result of the request is returned in ret>flags. This field contains the single worst result; the rating is the same as for the T_NEGOTIATE flag.
  1666.     For each level, the option T_ALLOPT can be requested on input. All supported options of this level with their current values are returned. In this case, ret>opt.maxlen, must be given at least the value in info>options. (See GetEndpointInfo) before the call.
  1667. The option T_ALLOPT can be used only with the OptionManagement  call, and even then, only with the actions T_NEGOTIATE, T_DEFAULT, and T_CURRENT. It can be used with any supported level and addresses all supported options of this level. The option has no value; it consists of a TOption only. Since in a OptionManagement call, only options of one level may be addressed, this option should not be requested together with other options. The function returns as soon as this option is processed.
  1668. Other options are processed in the order they appear in the input option buffer. If an option is multiply input, it depends on the implementation whether it is multiply output or whether it is returned only once.
  1669. Endpoints may not be able to provide an interface capable of supporting the T_NEGOTIATE and/or the T_CHECK actions. In this case the kOTNotSupportedErr error is returned.
  1670. For an endpoint in synchronous mode, the endpoint will return results of the option management in the TOptMgmt structure pointed to by the req parameter.
  1671. If the endpoint is in asynchronous mode, a notification routine has been installed, and the OptionManagement function returns kOTNoError, a T_OPTIONMGMTCOMPLETE event will be issued when the function completes.  The result parameter will be kOTNoError if the function completed successfully.  Otherwise, it will contain a result code describing the reason that the function failed.  The cookie parameter passed to the notification routine to indicate completion contains the value of the ret  parameter that was passed to the original function call.
  1672. If a notification routine has not been installed, it is not possible to determine when this command is completed.
  1673. While an OptionManagement call is outstanding, any other functions that are called for the same endpoint will return with a kOTStateChangeErr result code.
  1674. Note: In asynchronous mode, the T_OPTIONMGMTCOMPLETE event may be issued before the OptionManagement function returns to the client.
  1675. XTI-Level Options
  1676. XTI-level options are not specific to a particular endpoint. An XTI implementation supports none, all, or any subset of the options defined below. An implementation may restrict the use of any of these options by offering them only in the privileged or read-only mode.
  1677. The options below are not association-related. They may be negotiated in all XTI states. The protocol level for all of these options is XTI_GENERIC.
  1678. option name    type of option
  1679. value    legal
  1680. option value    meaning
  1681. XTI_DEBUG    array of unsigned longs    see text    enable debugging
  1682. XTI_LINGER    struct linger    see text    linger on close if data present
  1683. XTI_RCVBUF    unsigned long    size in bytes    receive buffer size
  1684. XTI_RCVLOWAT    unsigned long    size in bytes    rcv low-water mark
  1685. XTI_SNDBUF    unsigned long    size in bytes    send buffer size
  1686. XTI_SNDLOWAT    unsigned long    size in bytes    send low-water mark
  1687. A request for XTI_DEBUG is an absolute requirement. A request to activate XTI_LINGER is an absolute requirement; the timeout value to this option is not. XTI_RCVBUF, XTI_RCVLOWAT, XTI_SNDBUF, XTI_SNDLOWAT are not absolute requirements.
  1688. XTI_DEBUG    This option enables debugging. The values of this option are implementation defined. Debugging is disabled if the option is specified with no value.
  1689. XTI_LINGER    This option is used to linger the execution of a CloseProvider if data is still queued in the send buffer. The option value specifies the linger period. If CloseProvider is issued, and the send buffer is not empty, the endpoint attempts to send the pending data within the linger period before closing the endpoint. Data still pending after the linger period has elapsed is discarded.
  1690.     CloseProvider will  immediately return and the endpoint holds the connection open for at most the linger period.
  1691.     The option value consists of a t_linger structure:
  1692.         struct t_linger
  1693.         {
  1694.             long l_onoff;    // switch option on/off
  1695.             long l_linger;    // linger period in seconds
  1696.         };
  1697.     The legal values for the l_onoff field are:
  1698.         T_NO    switch the option off
  1699.         T_YES    activate option
  1700.     The value of l_onoff is an absolute requirement.
  1701.     The l_linger field determines the linger period in seconds. The client can request the default value by setting the field to T_UNSPEC. The default timeout values depend upon the endpoint (It is often T_INFINITE.) Legal values for this field are T_UNSPEC, T_INFINITE, and all non-negative numbers.
  1702.     The l_linger field is not an absolute requirement. An implementation may place upper and lower limits to this value. Requests that fall short of the lower limit are negotiated to the lower limit.
  1703.     Note that this option does not linger the execution of SndDisconnect.
  1704. XTI_RCVBUF    This option is used to adjust the internal buffer size allocated for the receive buffer. The buffer size may be increased for high-volume connections, or decreased to limit the possible backlog of incoming data.
  1705.     This request is not an absolute requirement. An implementation may place upper and lower limits to this value. Requests that fall short of the lower limit are negotiated to the lower limit.
  1706.     Legal values are all positive numbers.
  1707. XTI_RCVLOWAT    This option is used to set a low-water mark in the receive buffer. The option value gives the minimal number of bytes that must have accumulated in the receive buffer before they become visible to the client. If and when the amount of accumulated received data exceeds the low-water mark, a T_DATA event is issued. The client may then read the data with Rcv or RcvUData.
  1708.     This request is not an absolute requirement. An implementation may place upper and lower limits to this value. Requests that fall short of the lower limit are negotiated to the lower limit.
  1709.     Legal values are all positive numbers.
  1710. XTI_SDNBUF    This option is used to adjust the internal buffer size allocated for the send buffer.
  1711.     This request is not an absolute requirement. An implementation may place upper and lower limits to this value. Requests that fall short of the lower limit are negotiated to the lower limit.
  1712.     Legal values are all positive numbers.
  1713. XTI_SNDLOWAT    This option is used to set a low-water mark in the send buffer. The option value gives the minimal number of bytes that must have accumulated in the send buffer before they are sent.
  1714.     This request is not an absolute requirement. An implementation may place upper and lower limits to this value. Requests that fall short of the lower limit are negotiated to the lower limit.
  1715.     Legal values are all positive numbers.
  1716. Valid States
  1717. All 
  1718. RESULT CODES
  1719. kOTAccessErr
  1720. kOTBadFlagErr
  1721. kOTBadOptionErr
  1722. kOTCanceledErr
  1723. kOTNotSupportedErr
  1724. See Also
  1725. OTCreateOptions,OTCreateOptionString,Accept,Alloc,Connect,GetEndpointInfo,  Listen, OpenEndpoint, RcvConnect
  1726.  
  1727. .c2.Using Connectionless Datagrams;
  1728. The functions in this section apply only to connectionless datagram endpoints. A connectionless datagram endpoint usually provides a datagram service. Protocols such as DDP, IP, PPP, 802.2 Type 1, 802.3, etc., are connectionless endpoints.
  1729. The SndUData function is used to send data on a connectionless datagram. Each SndUData function call requires the protocol address of the destination of the datagram.
  1730. Some endpoint implementations do not detect an error in the attempt to send a datagram until after the SndUData function has already returned successfully. In this case, the endpoint will issue a T_UDERR event and the client can determine the particular error by issuing the RcvUDErr function.
  1731. The RcvUData function is used to read incoming datagrams. Each datagram read will have a remote protocol address (the source) associated with it.
  1732. Both the RcvUData and SndUData functions are supported only when the endpoint is bound and in the T_IDLE state.
  1733. .c3..i.SndUData;
  1734. FUNCTION
  1735. SndUData    Send a data unit.
  1736. C INTERFACE
  1737. OSStatus    OTSndUData(EndpointRef ref, TUnitData* udata);
  1738. C++ INTERFACE
  1739. OSStatus    TEndpoint::SndUData(TUnitData* udata);
  1740. Description
  1741. Parameters    Before
  1742. Call    After
  1743. Call
  1744. ref (C only)    x    /
  1745. udata>addr.maxlen    /    /
  1746. udata>addr.len    x >= 0    /
  1747. udata>addr.buf    (x)    /
  1748. udata>opt.maxlen    /    /
  1749. udata>opt.len    x >= 0    /
  1750. udata>opt.buf    (?)    /
  1751. udata>udata.maxlen    /    /
  1752. udata>udata.len    x    /
  1753. udata>udata.buf    (x)    /
  1754. SndUData is used on connectionless datagram endpoints to send a data unit. The udata parameter points to a TUnitData structure containing the following fields:
  1755. struct TNetbuf addr;
  1756. struct TNetbuf opt;
  1757. struct TNetbuf udata;
  1758. The addr field specifies the protocol address of the destination, opt identifies any endpoint-specific options that the client wants to use for this request, and udata specifies the client data to be sent. The client may choose not to specify protocol options by setting the len field inside the opt TNetbuf to zero.
  1759. The udata member of the udata parameter contains the data to be sent. If the udata>udata.len field is zero, and sending of zero data bytes is not supported by the endpoint, the kOTBadDataErr error will be generated. 
  1760. If the amount of data in udata exceeds the current TSDU size, a kOTBadDataErr error will be generated.
  1761. A client may send non-contiguous data by setting the udata->udata.buf pointer to point to an OTData structure, and setting the udata->udata.len value to kNetbufDataIsOTData
  1762. It is not possible for all endpoints to detect the conditions that result in the kOTBadAddressErr or kOTBadOptionErr errors. The existence of these errors is signaled by a T_UDERR event, and the client can read them by making the RcvUDErr function call.
  1763. The client may negotiate the XTI_SNDLOWAT option with an endpoint using the OptionManagement function. This option value gives the minimal number of bytes that must have accumulated in the endpoint’s send buffer before they are sent. Not all endpoints support the XTI_RCVLOWAT option.
  1764.  
  1765. If the endpoint is in non-blocking or asynchronous mode, the SndUData function will return a kOTFlowErr if flow control restrictions prevent the data from being accepted by the transport provider at the time the function is issued.  After this error occurs, a T_GODATA event will be issued when the flow control restrictions are lifted. This error will never be returned if the endpoint is in blocking mode.
  1766. The behavior of SndUData is summarized in the table below.
  1767.  
  1768. Sync/Blocking    kOTFlowErr never returned
  1769. Returns when flow control lifts
  1770.  
  1771. Sync/Non-Blocking    kOTFlowErr may be returned
  1772. Returns to caller immediately
  1773.  
  1774. Async/Blocking    kOTFlowErr may be returned
  1775. Returns to caller immediately
  1776.  
  1777. Async/Non-Blocking    kOTFlowErr may be returned
  1778. Returns to caller immediately
  1779.  
  1780.  
  1781. Valid States
  1782. T_IDLE
  1783. RESULT CODES
  1784. kOTAccessErr
  1785. kOTBadAddressErr
  1786. kOTBadOptionErr
  1787. kOTCanceledErr
  1788. kOTFlowErr
  1789. kOTLookErr
  1790. kOTNotSupportedErr
  1791. kOTOutStateErr
  1792. See Also
  1793. AckSends, DontAckSends, RcvUDErr
  1794. .c3..i.RcvUDErr;
  1795. FUNCTION
  1796. RcvUDErr    Read the error result from a previous call to the SndUData function.
  1797. C INTERFACE
  1798. OSStatus    OTRcvUDErr(EndpointRef ref, TUDErr* uderr);
  1799. C++ INTERFACE
  1800. OSStatus    TEndpoint::RcvUDErr(TUDErr* uderr);
  1801. Description
  1802. Parameters    Before
  1803. Call    After
  1804. Call
  1805. ref (C only)    x    /
  1806. uderr>addr.maxlen    x    /
  1807. uderr>addr.len    /    x
  1808. uderr>addr.buf    ?    (?)
  1809. uderr>opt.maxlen    x    /
  1810. uderr>opt.len    /    x
  1811. uderr>opt.buf    ?    (?)
  1812. uderr>error    /    x
  1813. RcvUDErr is used with connectionless datagram endpoints to receive an error result on a previously sent data unit, and should be issued only after the endpoint has detected a unit data error and has issued the T_UDERR event.
  1814. The client passes a pointer to a TUDErr structure containing the following members:
  1815. struct TNetbuf addr;
  1816. struct TNetbuf opt;
  1817. SInt32 error;
  1818. Before calling RcvUDErr, you must set the maxlen fields of addr and opt, to indicate the maximum size of each buffer. If the size of a result exceeds that of one of these buffers, RcvUDErr returns the result code kOTBufferOverflowErr. The error indication, however, is nonetheless cleared.
  1819. When RcvUDErr returns, the udata>addr structure specifies the destination protocol address of the erroneous data unit, the udata>opt structure identifies protocol-specific options that were associated with the data unit, and udata>error specifies a protocol-dependent result code.
  1820. If the client does not care to identify the data unit that produced the error, the uderr parameter may be set to NULL, and RcvUDErr will clear the error indication without reporting any information to the client.
  1821. Valid States
  1822. T_IDLE
  1823. RESULT CODES
  1824. kOTBufferOverflowErr
  1825. kOTNotSupportedErr
  1826. kOTNoUDErrErr
  1827. kOTOutStateErr
  1828. See Also
  1829. SndUData, RcvUData
  1830. .c3..i.RcvUData;
  1831. FUNCTION
  1832. RcvUData    Read a data unit.
  1833. C INTERFACE
  1834. OSStatus    OTRcvUData(EndpointRef ref, TUnitData* udata, OTFlags* flags);
  1835. C++ INTERFACE
  1836. OSStatus    TEndpoint::RcvUData(TUnitData* udata, OTFlags* flags);
  1837. Description
  1838. Parameters    Before
  1839. Call    After
  1840. Call
  1841. ref (C only)    x    /
  1842. udata>addr.maxlen    x    /
  1843. udata>addr.len    /    x
  1844. udata>addr.buf    ?    (?)
  1845. udata>opt.maxlen    x    /
  1846. udata>opt.len    /    x
  1847. udata>opt.buf    ?    (?)
  1848. udata>udata.maxlen    x    /
  1849. udata>udata.len    /    x
  1850. udata>udata.buf    ?    (?)
  1851. flags    /    x
  1852. RcvUData is used by a connectionless datagram client to receive a data unit. The client passes a pointer to a TUnitData structure parameter, udata, to hold information associated with the received data unit, and flags is set on return to indicate that the complete data unit was not received. The TUnitData structure has the following members:
  1853. struct TNetbuf addr;
  1854. struct TNetbuf opt;
  1855. struct TNetbuf udata;
  1856. The maxlen fields of addr, udata  and opt must be set before calling this function. The maxlen field of the addr and opt indicates the maximum size of each buffer. 
  1857. On return from this call, addr contains the remote protocol address of the data unit, opt contains protocol-specific options that were associated with the data unit, and udata contains the user data that was received.
  1858. If the endpoint is in synchronous blocking mode, the endpoint will wait for data if none is currently available. Generally, this method of operation is discouraged as it may lead to a ‘hang’ if no data ever becomes available. If the client is doing other operations in synchronous mode, it should call SetNonBlocking before calling RcvUData, to prevent the RcvUData call from waiting indefinitely.
  1859. If the endpoint is in asynchronous mode or is not blocking, the function will fail with the kOTNoDataErr result if no data is available. If a notification routine has not been installed on the endpoint, a client may poll for the arrival of a data unit by calling Look and checking for the T_DATA event flag. Or, if the client has installed a notification routine on the endpoint, a T_DATA event will be passed to the notification routine (See InstallNotifier). Additionally, once a client gets the T_DATA event, it should not expect to get another T_DATA event until making the RcvUData call returns either a kOTNoDataError or kOTLookErr error.
  1860. Clients should be prepared for a T_DATA event and then a kOTNoDataErr error when a RcvUData call is made. This seems unusual, but may occur as endpoints reclaim unread data in low memory conditions (for unreliable endpoints, only).
  1861. If the buffer defined in the udata field of the TUnitData structure is not large enough to hold the current data unit, the buffer will be filled and T_MORE will be set in flags on return to indicate that another RcvUData call should be made to retrieve the rest of the data unit. Subsequent calls to RcvUData will return zero for the length of the address and options until the full data unit has been received.
  1862. Valid States
  1863. T_IDLE
  1864. RESULT CODES
  1865. kOTBufferOverflowErr
  1866. kOTCanceledErr
  1867. kOTLookErr
  1868. kOTNoDataErr
  1869. kOTNotSupportedErr
  1870. kOTOutStateErr
  1871. See Also
  1872. SetAsynchronous, SetBlocking, SetNonBlocking, SetSynchronous, SndUData
  1873.  
  1874. .c2.Using Connections
  1875. The section that follow describe how a client uses the Open Transport calls to establish a connection between two endpoints. This section only applies to connection-oriented endpoints. A client can either actively initiate a connection, or it can passively wait for an endpoint to receive an incoming connection request. Additionally, a client can wait for incoming connection requests on one endpoint and accept the connection on a different endpoint.
  1876. .c3.Initiating a connection;
  1877. Before initiating a connection on an endpoint, the client must first bind the endpoint with the Bind function. The client then uses the Connect function to initiate the connection. The parameters to the connect call include the address of the remote connection end, any data to send along with the connection request (if the particular protocol the endpoint implements allows it), and any connection options that the client wants to specify.
  1878. Synchronous Mode
  1879. If the endpoint is in synchronous mode, the connect function will not return until the connection has either been established, or the connection attempt has failed. If the connection succeeds, the function will return zero.
  1880. If the connection does not succeed, the function returns kOTLookErr. There will be a T_DISCONNECT event pending, and the event can be cleared by issuing the RcvDisconnect function.
  1881. The sequence below shows the order of events for a successful connection opening.
  1882.         Local                        Remote
  1883. Client makes a Connect call.
  1884. Remote end accepts the connection request.
  1885. Client’s Connect call returns with no error.
  1886. If remote end rejects the connection request, or the connection request fails in some other way, this is the sequence of events, for all synchronous endpoints:
  1887.         Local                        Remote
  1888. Client makes a Connect call.
  1889. Remote end rejects or ignores the connection request.
  1890. Client’s Connect call returns with kOTLookErr
  1891. Client issues RcvDisconnect call.
  1892. Asynchronous Mode
  1893. If the endpoint is in asynchronous mode, the connect function will return a result code of kOTNoDataErr.
  1894. When the connection is successfully established or the connection attempt fails, the Open Transport Library will call the client’s notification routine with a T_CONNECT event and pass the same value that the client passed in the Connect call’s rcvCall parameter as the cookie parameter .
  1895. If the connection attempt fails, then there is also a pending T_DISCONNECT event, and the client must call RcvDisconnect to clear this event. 
  1896. The sequence below shows the order of events for a successful connection opening.
  1897.         Local                        Remote
  1898. Client makes a Connect call. It returns with kOTNoDataErr.
  1899. Remote end accepts the connection request.
  1900. Client’s notification routine is called with a T_CONNECT event. The result code passed into the notification routine will be kOTNoError.
  1901. The client calls RcvConnect. The endpoint will change state to T_DATAXFER.
  1902. If remote end rejects the connection request, this is the sequence of events:
  1903.         Local                        Remote
  1904. Client makes a Connect call. It returns with kOTNoError.
  1905. Remote end rejects the connection request, or the request fails.
  1906. Client’s notification routine  is called with a T_DISCONNECT event
  1907. The client calls RcvDisconnect.
  1908. If some other error occurs, this will be the sequence of events:
  1909.         Local                        Remote
  1910. Client makes a Connect call. It returns with kOTNoError.
  1911.  
  1912. Client's notification routine is called with a T_CONNECT event with an error in the result code.
  1913.  
  1914. .c3.Waiting for a Connection;
  1915. The client prepares an endpoint for handling incoming connection requests by specifying a non-zero, positive value for the qlen field of the TBind structure passed into the Bind function. This causes the endpoint to start listening for incoming connection requests.
  1916. When a connection request arrives, the Open Transport Library will issue a T_LISTEN event to the client’s notification routine  to indicate that an incoming connection request has arrived. The client must issue the Listen function to retrieve the information associated with the connection request. This information includes the remote address, any options associated with the request, any data associated with the request, and a sequence number. The client must store this sequence number until the client has accepted or rejected the request.
  1917. The client can either reject the incoming connection request by calling the SndDisconnect function, or the client can accept the incoming connection by calling the Accept function. In both cases, the client must pass the sequence number returned from the Listen function to indicate which connection indication should be rejected or accepted.
  1918. If the qlen field in the TBind structure the client passed in the Bind function as the reqAdd parameter is greater than one, and the qlen field in the TBind structure passed as the retAddr parameter and filled in by the Bind function is greater than one, then the endpoint may handle simultaneous incoming connection requests. The sequence number returned by Listen is used to distinguish between them.
  1919. The sequence of events for accepting an incoming connection in synchronous mode is shown below.
  1920.         Local                        Remote
  1921. Client makes a Bind call with a qlen greater than zero.
  1922. Remote end uses Connect to send a connection request.
  1923. The client’s notifier is called with a T_LISTEN event.
  1924. Client makes a Listen call.
  1925. Client makes an Accept call to accept the request, or SndDisconnect to reject it.
  1926. Remote end’s Connect function returns to the caller. If the connection was rejected, then the remote end will also issue a RcvDisconnect to clear the T_DISCONNECT event.
  1927. The sequence of events for accepting an incoming connection in asynchronous mode is shown below.
  1928.         Local                        Remote
  1929. Client makes a Bind call with a qlen greater than zero. The local end is now ready to receive incoming connection requests.
  1930. Remote end uses Connect to send a connection request.
  1931. The client’s notifier is called with a T_LISTEN event.
  1932. Client makes a Listen call. (Listens are never asynchronous.)
  1933. Client makes an Accept call to accept the request, or SndDisconnect to reject it.
  1934. Remote end’s notification routine  is called with T_CONNECT to indicate the Connect call has completed. If the connection was rejected, then the remote end will also issue a RcvDisconnect to clear the T_DISCONNECT event.
  1935. The client’s notification routine  is called with either T_ACCEPTCOMPLETE or T_DISCONNECTCOMPLETE.
  1936.  
  1937. .c3.Tearing Down a Connection;
  1938. There are two ways of tearing down a connection. All connection-oriented endpoints support an .i.abortive disconnect;, and some connection-oriented endpoints may support an .i.orderly disconnect;.
  1939. In an abortive disconnect, the connection is torn down when the client makes the .i.SndDisconnect; function. This kind of disconnect can be a problem since data being sent is typically buffered locally before being sent. If a client makes a Snd call followed by a SndDisconnect call, the client can not be sure that the data was actually sent without agreeing upon some kind of handshake mechanism with its remote partner.
  1940. Some protocols, such as .i.TCP;, support an over-the-wire handshake when tearing down a connection. With these kinds of protocols, a client can make a SndOrderlyDisconnect call to initiate an orderly teardown of the connection. The underlying protocol will perform the end-to-end disconnect, and then notify the client (with a T_ORDREL event) when all buffered data has been sent (in both directions) and the connection has been torn down.
  1941. Most connection-oriented stream protocol definitions do not contain an over-the-wire mechanism for orderly disconnect (.i.NetBIOS;, .i.ADSP;, ISO .i.TP4;). However, these protocol implementations my still support the SndOrderlyDisconnect call. In these cases, the orderly disconnect is implemented locally. When a client issues a SndOrderlyDisconnect, the underlying protocol will ensure that all buffered data has been sent (and acknowledged if the protocol supports it). Only at this point, does the protocol actually tear down the connection and notify the client (with a .i.T_ORDREL ;event).
  1942. Abortive Disconnect
  1943. The sequence of events for an abortive disconnect is shown below:
  1944.         Local                        Remote
  1945. Client issues SndDisconnect
  1946. Client receives a .i.T_DISCONNECT ;event. Client makes a RcvDisconnect call and the endpoint state goes to T_IDLE.
  1947. Client’s notification routine  is called with a .i.T_DISCONNECTCOMPLETE; ;event. (asynchronous mode only)
  1948. Note: It is possible that a client may issue a SndDisconnect just as its remote partner is also tearing down the connection. One of the clients may receive a kOTLookErr result code from the SndDisconnect call, in which case it should issue a RcvDisconnect call to clear the event.
  1949. Orderly Disconnect
  1950. The sequence of events for an abortive disconnect is shown below for protocols (like TCP) that support over-the-wire orderly disconnects.
  1951.         Local                        Remote
  1952. Client issues SndOrderlyDisconnect. Endpoint state goes to T_OUTREL.
  1953. Client receives a T_ORDREL event. Client may continue to send and receive data.
  1954. Client may continue to receive data if more arrives, but client may not send any more data.
  1955. Client receives unread data, and then client acknowledges the T_ORDREL event by making the RcvOrderlyDisconnect call. The endpoint goes to the T_INREL state. The client may still send data.
  1956. Client continues to read data if remote end continues to send.
  1957. The client issues the SndOrderlyDisconnect call. At this point, the endpoint state goes to T_IDLE.
  1958. the connection is broken at this point
  1959. Client receives a T_ORDREL event. Client may neither receive nor send more data. Client issues a RcvOrderlyDisconnect to clear the event, and the endpoint state goes to T_IDLE.
  1960. The sequence of events for an abortive disconnect is shown below for protocols that do not support over-the-wire orderly disconnects (NetBIOS, ADSP, ISO TP4) but do implement orderly disconnects locally.
  1961.         Local                        Remote
  1962. Client issues SndOrderlyDisconnect. The underlying protocol sends all buffered data and then tears down the connection.
  1963. the connection is broken at this point
  1964. Client receives a T_ORDREL event. Client may continue to receive any locally buffered, unread data.
  1965. Client may continue to receive data (any unread data that was locally buffered before the client issued the SndOrderlyDisconnect), but may not send more data.
  1966. Client receives unread data, and then client acknowledges the T_ORDREL event by making the RcvOrderlyDisconnect call. The endpoint goes to the T_INREL state. 
  1967. The client issues the SndOrderlyDisconnect call. At this point, the endpoint state goes to T_IDLE.
  1968. Client receives a T_ORDREL event. Client may neither receive nor send more data. Client issues a RcvOrderlyDisconnect to clear the event, and the endpoint state goes to T_IDLE.
  1969. The sections that follow  describe the functions for creating and tearing down connections between connection-oriented endpoints.
  1970. .c3..i.Connect;
  1971. FUNCTION
  1972. Connect    Initiate a connection.
  1973. C INTERFACE
  1974. OSStatus    OTConnect(EndpointRef ref, TCall* sndCall, TCall* rcvCall)
  1975. C++ INTERFACE
  1976. OSStatus    TEndpoint::Connect(TCall* sndCall, TCall* rcvCall)
  1977. Description
  1978. Parameters    Before
  1979. Call    After
  1980. Call
  1981. ref (C only)    x    /
  1982. sndCall>addr.maxlen    x    /
  1983. sndCall>addr.len    /    /
  1984. sndCall>addr.buf    (x)    /
  1985. sndCall>opt.maxlen    x    /
  1986. sndCall>opt.len    x    /
  1987. sndCall>opt.buf    (x)    /
  1988. sndCall>udata.maxlen    /    /
  1989. sndCall>udata.len    x    /
  1990. sndCall>udata.buf    (?)    /
  1991. sndCall>sequence    /    /
  1992. rcvCall>addr.maxlen    x    /
  1993. rcvCall>addr.len    /    x
  1994. rcvCall>addr.buf    ?    (?)
  1995. rcvCall>opt.maxlen    x    /
  1996. rcvCall>opt.len    /    x
  1997. rcvCall>opt.buf    ?    (?)
  1998. rcvCall>udata.maxlen    x    /
  1999. rcvCall>udata.len    /    x
  2000. rcvCall>udata.buf    ?    (?)
  2001. rcvCall>sequence    /    /
  2002. Connect lets a client of an connection-oriented endpoint request a connection to the specified remote endpoint This function can be issued only in the T_IDLE state. The sndCall and recycle parameters point to TCall structures, which contain the following members:
  2003. struct TNetbuf addr;
  2004. struct TNetbuf opt;
  2005. struct TNetbuf udata;
  2006. OTSequence sequence;
  2007. The sndCall parameter specifies information needed by the endpoint to establish a connection. The rcvCall parameter will be filled in with information associated with the newly established connection (synchronous mode only). In asynchronous mode, the rcvCall parameter is ignored.
  2008. The sndCall>addr member specifies the protocol address of the remote endpoint.
  2009. The sndCall>opt member provides any protocol-specific options that the client may want to specify (See the “Option Negotiation” section). The client may choose not to negotiate protocol options by setting the sndCall>opt.len field to zero.
  2010. The sndCall>udata member contains any optional user data that may be passed to the remote endpoint during connection establishment. 
  2011. The sndCall>udata.buf field points to a buffer containing the data, whose length is sndCall>udata.len.
  2012. The client may not send more data than the endpoint allows. This information is returned in the connect field of a TEndpointInfo structure filled out by the OpenEndpoint or GetEndpointInfo functions. If the sndCall>udata.len field is zero, no data will be sent to the remote endpoint.
  2013. The sndCall>sequence member has no meaning for this function.
  2014. If the endpoint is in synchronous mode, the Connect call will wait for the connection to be established before returning, and the addr, opt, and udata fields of the TCall structure pointed to by rcvCall will be updated with values associated with the connection. When a synchronous Connect call is interrupted because of an asynchronous event, such as a rejected connection, the state of the endpoint is set to T_OUTCON, allowing a client to call  RcvConnect to wait for the connect to complete.  Call RcvDisconnect to read the result of a rejected connection request.
  2015. In asynchronous mode, the Connect function will return after initiating the connection request before the connect function has completed. The kOTNoDataErr error is returned to indicate the connect is in progress. The client will receive a T_CONNECT event when the connect operation completes successfully, and must issue the RcvConnect function to read the connection parameters that would have been returned in the rcvCall structure if the Connect call had been issued in synchronous mode.
  2016. If the Connect function returns a result other than kOTNoDataErr, then the connection attempt has not been initiated and no events will be received.
  2017. When a connection is rejected, the client receives a T_DISCONNECT event. Then client must then call RcvDisconnect to clear the error.
  2018. Valid States
  2019. T_IDLE
  2020. RESULT CODES
  2021. kOTAccessErr
  2022. kOTAddressBusyErr
  2023. kOTBadAddressErr
  2024. kOTBadDataErr
  2025. kOTBadOptionErr
  2026. kOTBufferOverflowErr
  2027. kOTCanceledErr
  2028. kOTLookErr
  2029. kOTNotSupportedErr
  2030. kOTOutStateErr
  2031. See Also
  2032. None
  2033. .c3..i.RcvConnect;
  2034. FUNCTION
  2035. RcvConnect    Read the status of an outstanding or completed asynchronous call to the  function Connect.
  2036. C INTERFACE
  2037. OSStatus    OTRcvConnect(EndpointRef ref, TCall* call);
  2038. C++ INTERFACE
  2039. OSStatus    TEndpoint::RcvConnect(TCall* call);
  2040. Description
  2041. Parameters    Before
  2042. Call    After
  2043. Call
  2044. ref (C only)    x    /
  2045. call>addr.maxlen    x    /
  2046. call>addr.len    /    x
  2047. call>addr.buf    ?    (?)
  2048. call>opt.maxlen    x    /
  2049. call>opt.len    /    x
  2050. call>opt.buf    ?    (?)
  2051. call>udata.maxlen    x    /
  2052. call>udata.len    /    x
  2053. call>udata.buf    ?    (?)
  2054. call>sequence    /    /
  2055. RcvConnect is used by a client of a connection-oriented endpoint to read the status of a previously issued Connect. The Connect call may still be pending in which case kOTNoDataErr is returned. The call parameter points to a TCall structure, which is filled in by the endpoint with information describing the established connection. The TCall structure has the following members:
  2056. struct TNetbuf addr;
  2057. struct TNetbuf opt;
  2058. struct TNetbuf udata;
  2059. OTSequence sequence;
  2060. The addr member returns the protocol address of the endpoint that accepted the connection request. Note that this may not be the same address that received the connection request. The addr.maxlen field must be initialized by the client with a value large enough to hold the address before making the call.
  2061. The opt member is filled in with protocol-specific parameters associated with the established connection. The opt.maxlen field must be initialized by the client before the call with a value large enough to hold the options.
  2062. The udata member is filled in with data associated with the connection request. 
  2063. The udata.buf field points to a client-supplied buffer of size udata.maxlen to hold the data. 
  2064. The sequence member has no meaning for this function.
  2065. The call parameter may be NULL, in which case no information is returned to the client by RcvConnect.
  2066. If the endpoint is synchronous and blocking, RcvConnect will wait for the connection to be accepted or rejected.  A kOTNoError result code will indicate that the connection was accepted, and a kOTLookErr result code will indicate that the connection was rejected (The client will need to call Look to verify that a T_DISCON event is the reason for the kOTLookErr, and then call RcvDisconnect to clear the event indication.
  2067. Otherwise, RcvConnect will return with a kOTNoDataErr if the connection attempt has not yet completed.
  2068. Valid States
  2069. T_OUTCON
  2070. RESULT CODES
  2071. kOTCanceledErr
  2072. kOTNotSupportedErr
  2073. kOTOutStateErr
  2074. kOTNoDataErr
  2075. kOTBufferOverflowErr
  2076. See Also
  2077. Connect
  2078. .c3..i.Listen;
  2079. FUNCTION
  2080. Listen    Listen for an incoming connection request.
  2081. C INTERFACE
  2082. OSStatus    OTListen(EndpointRef ref, TCall* call);
  2083. C++ INTERFACE
  2084. OSStatus    TEndpoint::Listen(TCall* call);
  2085. Description
  2086. Parameters    Before
  2087. Call    After
  2088. Call
  2089. ref (C only)    x    /
  2090. call>addr.maxlen    x    /
  2091. call>addr.len    /    x
  2092. call>addr.buf    ?    (?)
  2093. call>opt.maxlen    x    /
  2094. call>opt.len    /    x
  2095. call>opt.buf    ?    (?)
  2096. call>udata.maxlen    x    /
  2097. call>udata.len    /    x
  2098. call>udata.buf    ?    (?)
  2099. call>sequence    /    x
  2100. Listen is used by a client of a connection-oriented endpoint to listen for an incoming connection request. The call parameter points to a TCall structure which is filled in by the endpoint with information describing the connection indication. The TCall structure has the following members:
  2101. struct TNetbuf addr;
  2102. struct TNetbuf opt;
  2103. struct TNetbuf udata;
  2104. OTSequence sequence;
  2105. The addr member returns the protocol address of the calling endpoint. This address is in a format usable in future calls to Connect or Accept.  The addr.maxlen field must be initialized by the client before the call with a value large enough to hold the address.
  2106. The opt member is filled in with protocol-specific parameters associated with the connection request. The opt.maxlen field must be initialized by the client before the call with a value large enough to hold the options.
  2107. The udata member is filled in with data associated with the connection request.
  2108. The udata.buf field points to a client-supplied buffer of size udata.maxlen to hold the data. 
  2109. The sequence member is filled in with a value that uniquely identifies the connect indication. Because connection indications are uniquely identified, a client can listen for multiple connect indications before responding to any of them.
  2110. If the endpoint is in synchronous mode and is blocking, Listen will not return until a connection indication has been received.
  2111. If the endpoint is in asynchronous mode or is not blocking, Listen will return any pending connection request, or it will return kOTNoDataErr if there are no pending connection requests.
  2112. Valid States
  2113. T_IDLE, T_INCON
  2114. RESULT CODES
  2115. kOTBadQLenErr
  2116. kOTCanceledErr
  2117. kOTLookErr
  2118. kOTNoDataErr
  2119. kOTNotSupportedErr
  2120. kOTOutStateErr
  2121. kOTQFullErr
  2122. See Also
  2123. None
  2124. .c3..i.Accept;
  2125. FUNCTION
  2126. Accept    Accept an incoming connection request.
  2127. C INTERFACE
  2128. OSStatus    OTAccept(EndpointRef ref, EndpointRef resRef, TCall* call);
  2129. C++ INTERFACE
  2130. OSStatus    TEndpoint::Accept(EndpointRef resRef, TCall* call);
  2131. Description
  2132. Parameters    Before
  2133. Call    After
  2134. Call
  2135. ref (C only)    x    /
  2136. call>addr.maxlen    /    /
  2137. call>addr.len    x    /
  2138. call>addr.buf    (?)    /
  2139. call>opt.maxlen    /    /
  2140. call>opt.len    x    /
  2141. call>opt.buf    (?)    /
  2142. call>udata.maxlen    /    /
  2143. call>udata.len    x    /
  2144. call>udata.buf    (?)    /
  2145. call>sequence    x    /
  2146. Accept is used by a client to accept a connection request. The client can either accept the connection on the same endpoint that received the connection request, or the client can specify another endpoint that should accept the connection. The call parameter points to a TCall structure containing the following members:
  2147. struct TNetbuf addr;
  2148. struct TNetbuf opt;
  2149. struct TNetbuf udata;
  2150. OTSequence     sequence; 
  2151. The addr member contains the protocol address of the calling endpoint. The client need not specify an address by setting the addr.len field to zero. If an address is provided, it may be optionally checked by the endpoint.
  2152. The opt member indicates any protocol-specific parameters associated with the connection. The values of parameters specified by opt and the syntax of those are protocol-specific. See the section on option negotiation for further discussion. If the user does not indicate any protocol-specific options (by setting opt.len to zero), it is assumed that the connection is to be accepted unconditionally. The endpoint may choose options other than the defaults to ensure that the connection is accepted successfully.
  2153. The udata member contains any user data to be returned to the calling endpoint. The amount of user data must not exceed the limits supported by the endpoint as returned in the connect field of the TEndpointInfo structure filled out on a call to OpenEndpoint or GetEndpointInfo. 
  2154. The data to be sent is pointed to by udata.buf, and the number of bytes is specified by udata.len.
  2155. The sequence member is the value returned by Listen that uniquely associates the response with a previously received connect indication.
  2156. If a client accepts a connection on the same endpoint that received the connection indication, the client must have responded to all previous connect indications received on the endpoint via the Accept or SndDisconnect functions. Otherwise, the Accept function will fail with the result code kOTIndOutErr.
  2157. If a different endpoint is specified, then the client may or may not choose to bind the endpoint before the Accept call is issued. If the endpoint is not bound before the Accept call, then the transport provider will automatically bind it to the same protocol address the endpoint that received the connection request was bound to. If the client chooses to bind the endpoint, it must be bound to a protocol address with a qlen of zero and must be in the T_IDLE state before the Accept call is made. The endpoint that ends up with the open connection will receive a .i.T_PASSCON ;event to indicate that a connection is open.
  2158. The call to Accept will fail with kOTLookErr if there are indications (T_DISCONNECT or T_LISTEN) waiting to be received.
  2159. WARNING:  Calling Accept on an endpoint that was bound with a qlen greater than 1 can result in a kOTLookErr being returned because another T_LISTEN event has arrived.  Unfortunately, XTI specifies that the Accept cannot be acted on until a Listen has been issued to receive this new connection request.  This effectively means that you need to keep an array of outstanding connection requests. If you are acting on T_LISTEN events in your notifier, then you need to be able to handle having "qlen" outstanding connection requests, issuing an Accept, and getting a T_LISTEN event before the Accept returns to you.
  2160. If the endpoint is in asynchronous mode the Accept function will return immediately.  A result code of kOTNoError indicates that the Accept has begun and the client will be notified when it is complete.
  2161. The endpoint that issued the accept will receive a T_ACCEPTCOMPLETE event.  The endpoint receiving the connection will receive a T_PASSCON event.  In the case where these two endpoints are the same, the endpoint will receive both events.  The cookie parameter for the T_ACCEPTCOMPLETE event is the EndpointRef of the endpoint that issued the accept.  The cookie paramter for the T_PASSCON event is the EndpointRef of the endpoint that received the connection.
  2162. If the Accept fails, the connection indication is still outstanding, and still needs to be dealt with (probably by issuing a SndDisconnect).
  2163. If a notification routine is not installed, the client can poll the accepting endpoint, waiting for the state to change to T_DATAXFER
  2164. Note: In asynchronous mode, it is possible for the endpoint to issue the T_ACCEPTCOMPLETE event before the Accept function returns the kOTNoError result to the client.
  2165. Valid States
  2166. ref (C) or this: (C++) T_INCON
  2167. resRef T_IDLE or T_UNBND
  2168. RESULT CODES
  2169. kOTBadAddressErr
  2170. kOTBadDataErr
  2171. kOTBadOptionErr
  2172. kOTBadReferenceErr
  2173. kOTBadSequenceErr
  2174. kOTCanceledErr
  2175. kOTIndOutErr
  2176. kOTLookErr
  2177. kOTNotSupportedErr
  2178. kOTOutStateErr
  2179. kOTProviderMismatchErr
  2180. kEPROTOErr
  2181. See Also
  2182. SndDisconnect , Listen
  2183. .c3..i.SndDisconnect;
  2184. FUNCTION
  2185. SndDisconnect    Tear down an open connection or refuse an incoming connection request.
  2186. C INTERFACE
  2187. OSStatus    OTSndDisconnect(EndpointRef ref, TCall* call);
  2188. C++ INTERFACE
  2189. OSStatus    TEndpoint::SndDisconnect(TCall* call);
  2190. Description
  2191. Parameters    Before
  2192. Call    After
  2193. Call
  2194. ref (C only)    x    /
  2195. call>addr.maxlen    /    /
  2196. call>addr.len    /    /
  2197. call>addr.buf    /    /
  2198. call>opt.maxlen    /    /
  2199. call>opt.len    /    /
  2200. call>opt.buf    /    /
  2201. call>udata.maxlen    /    /
  2202. call>udata.len    x    /
  2203. call>udata.buf    (?)    /
  2204. call>sequence    ?    /
  2205. SndDisconnect initiates an abortive release on an already established connection, or rejects a connection request. The call parameter points to a TCall structure, which contains the following members:
  2206. struct TNetbuf addr;
  2207. struct TNetbuf opt;
  2208. struct TNetbuf udata;
  2209. OTSequence sequence;
  2210. The values in this structure have different semantics depending upon the context of the call to SndDisconnect. When rejecting a connection request, call must be non-NULL and contain a valid value for sequence to uniquely identify the rejected connect indication to the endpoint. The sequence field is meaningful only if the connection is in the T_INCON state. The addr and opt fields of call are ignored. In all other cases, call need only be used when data is being sent with the disconnect request. The addr, opt, and sequence fields of the TCall structure are ignored. If the client does not wish to send data to the remote client, the value of call may be a null pointer.
  2211. The udata member specifies the client data to be sent to the remote client. The amount of user data must not exceed the limits supported by the endpoint, as returned in the discon field of the TEndpointInfo structure filled out by the OpenEndpoint or GetEndpointInfo functions. The data to be sent is pointed to by udata.buf, and the number of bytes is specified by udata.len.
  2212. If the endpoint is in asynchronous mode the SndDisconnect function will return immediately.  A result code of kOTNoError indicates that the SndDisconnect has begun and the client will be notified when it is complete.
  2213. When the disconnect has been completed and a notification routine  has been installed (See InstallNotifier), a T_DISCONNECTCOMPLETE event will be issued. 
  2214. If a notification routine  has not been installed, it is not possible to determine when the SndDisconnect function is complete.
  2215. The cookie parameter passed to the notification routine to indicate completion is the call parameter.
  2216. Valid States
  2217. T_DATAXFER, T_OUTCON, T_OUTREL, T_INREL (and T_INCON, when two or more incoming connection requests are outstanding)
  2218. RESULT CODES
  2219. kOTBadDataErr
  2220. kOTBadSequenceErr
  2221. kOTCanceledErr
  2222. kOTLookErr
  2223. kOTNotSupportedErr
  2224. kOTOutStateErr
  2225. See Also
  2226. None
  2227. .c3..i.RcvDisconnect;
  2228. FUNCTION
  2229. RcvDisconnect    Identify the cause of a disconnect, and acknowledge the corresponding disconnect event.
  2230. C INTERFACE
  2231. OSStatus    OTRcvDisconnect(EndpointRef ref, TDiscon* discon);
  2232. C++ INTERFACE
  2233. OSStatus    TEndpoint::RcvDisconnect(TDiscon* discon);
  2234. Description
  2235. Parameters    Before
  2236. Call    After
  2237. Call
  2238. ref (C only)    x    /
  2239. discon>udata.maxlen    x    /
  2240. discon>udata.len    /    x
  2241. discon>udata.buf    ?    (?)
  2242. discon>reason    /    x
  2243. discon>sequence    /    ?
  2244. RcvDisconnect identifies the reason that a connection that was torn down or that a connection request failed or was rejected. RcvDisconnect clears the corresponding disconnect event, and retrieves any user data sent with the disconnect. The client passes a pointer to a TDiscon structure, in which the endpoint returns the reason for the disconnect and returns any data sent with the disconnect. The TDiscon structure has the following members:
  2245. struct TNetbuf udata;
  2246. OTReason reason;
  2247. OTSequence sequence;
  2248. The reason field specifies the reason for the disconnect through a protocol-dependent reason code.
  2249. The udata field is filled in with any user data that was sent with the disconnect. The udata.buf field points to a client-supplied buffer of size udata.maxlen to hold the request. 
  2250. The sequence field may identify an outstanding connection indication with which the disconnect is associated. The sequence field is meaningful only when RcvDisconnect is issued by a passive endpoint client that has issued one or more Listen functions and is processing the resulting connect indications. If a disconnect indication occurs, sequence can be used to identify which of the outstanding connection indications is associated with the disconnect.
  2251. If a client does not care if there is incoming data and does not need to know the value of reason or sequence, the discon parameter may be a NULL pointer. In this case, any user data associated with the disconnect will be discarded. However, if a client has retrieved more than one outstanding connect indication (via Listen), and the discon parameter is NULL, the user will be unable to identify with which connect indication the disconnect is associated.
  2252. RcvDisconnect behaves exactly the same in all operational modes of an endpoint.  If there is no disconnect pending, kOTNoDisconnectErr will be return.  If there is, either kOTNoError or kOTBufferOverflowErr will be returned.
  2253.  
  2254. Valid States
  2255. T_DATAXFER, T_OUTCON, T_OUTREL, T_INREL, T_INCON (when number of outstanding incoming connection requests > 1)
  2256. RESULT CODES
  2257. kOTNoDisconnectErr
  2258. kOTNotSupportedErr
  2259. kOTOutStateErr
  2260. kOTBufferOverflowErr
  2261. See Also
  2262. None
  2263. .c3..i.SndOrderlyDisconnect;
  2264. FUNCTION
  2265. SndOrderlyDisconnect    Initiate an orderly tear-down of a connection.
  2266. C INTERFACE
  2267. OSStatus    OTSndOrderlyDisconnect(EndpointRef ref);
  2268. C++ INTERFACE
  2269. OSStatus    TEndpoint::SndOrderlyDisconnect();
  2270. Description
  2271. Parameters    Before
  2272. Call    After
  2273. Call
  2274. ref (C only)    x    /
  2275. SndOrderlyDisconnect initiates an orderly release of a connection and indicates to the endpoint that the client has no more data to send. After calling SndOrderlyDisconnect, the client must not send any more data over the connection. However, the client may continue to receive data if an orderly release indication has not been received. 
  2276. This function is an optional service of the endpoint; it is supported only if the endpoint returned T_COTS_ORD or T_TRANS_ORD in the servtype field of the TEndpointInfo structure filled out by the OpenEndpoint or GetEndpointInfo functions.
  2277. SndOrderlyDisconnect behaves exactly the same in all operational modes of an endpoint.  The return value will be kOTNoError if the function succeeded, and an error result if it did not.
  2278. Valid States
  2279. T_DATAXFER, T_INREL
  2280. RESULT CODES
  2281. kOTLookErr
  2282. kOTNotSupportedErr
  2283. kOTOutStateErr
  2284. See Also
  2285. None
  2286. .c3..i.RcvOrderlyDisconnect;
  2287. FUNCTION
  2288. RcvOrderlyDisconnect    Acknowledge an incoming request for an orderly connection tear-down.
  2289. C INTERFACE
  2290. OSStatus    OTRcvOrderlyDisconnect(EndpointRef ref);
  2291. C++ INTERFACE
  2292. OSStatus    TEndpoint::RcvOrderlyDisconnect();
  2293. Description
  2294. Parameters    Before
  2295. Call    After
  2296. Call
  2297. ref (C only)    x    /
  2298. RcvOrderlyDisconnect acknowledges receipt of an orderly release indication. After receiving this indication, the user must not attempt to receive more data; any subsequent calls to Rcv return the result code kOTOutStateErr. The user can, however, continue sending data over the connection, if SndOrderlyDisconnect has not yet been called by the client. This function is an optional service of the endpoint and is supported only if the endpoint returned T_COTS_ORD or T_TRANS_ORD in the servtype field of the TEndpointInfo structure filled out by the OpenEndpoint or GetEndpointInfo functions.
  2299. RcvOrderlyDisconnect behaves exactly the same in all operational modes of an endpoint.  If there is no disconnect pending, kOTNoReleaseErr will be return.  If there is, either kOTNoError or kOTBufferOverflowErr will be returned.
  2300. Valid States
  2301. T_DATAXFER, T_OUTREL
  2302. RESULT CODES
  2303. kOTLookErr
  2304. kOTNoReleaseErr
  2305. kOTNotSupportedErr
  2306. kOTOutStateErr
  2307. See Also
  2308. None
  2309.  
  2310. .c2.Using Connection-Oriented Streams;
  2311. Open Transport supports connection-oriented stream endpoints. There are two Open Transport functions specific to this type of endpoint—Snd and Rcv.
  2312. A client uses the Snd function to send data to the remote endpoint and uses Rcv to receive data from the remote endpoint. Some endpoints support .i.expedited data; in addition to normal data. However, protocol endpoints that support expedited data usually handle the data in significantly different ways depending upon the particular protocol being implemented. In general, clients should not use expedited data as this will lead to non-transport-independent code.
  2313. Some endpoints support the concept of logical separators in the data stream that will be passed from one endpoint to another. These logical separators break the stream up into .i.Transport Service Data Units; (.i.TSDU;) Some endpoints have a maximum size TSDU that may be supported, while other endpoints have no size limit. A client uses the GetEndpointInfo function to find out what the TSDU size is for both normal and expedited data (the .i.ETSDU;). The values can be found in the tsdu and etsdu fields of the TEndpointInfo structure. A value of 0 indicates that no logical separator is supported, a value of -1 indicates that there is no maximum size to a TSDU, a positive number indicates the maximum size of a TSDU, and -2 indicates that normal (or expedited in the case of etsdu) data is not supported by the endpoint.
  2314. Note: Some endpoints that support TSDUs have a variable maximum size limit. A client should be aware that the values for tsdu and etsdu that are returned when the endpoint is opened (with OTOpenEndpoint) may be different if queried again using GetEndpointInfo after a connection has been opened because the endpoints may have negotiated different values during the connection-establishment process.
  2315. .c3..i.Snd;
  2316. FUNCTION
  2317. Snd    Send data on a connection-oriented stream.
  2318. C INTERFACE
  2319. OTResult    OTSnd(EndpointRef ref, void* buf, size_t nbytes, OTFlags flags);
  2320. C++ INTERFACE
  2321. OTResult    TEndpoint::Snd(void* buf, size_t nbytes, OTFlags flags);
  2322. Description
  2323. Parameters    Before
  2324. Call    After
  2325. Call
  2326. ref (C only)    x    /
  2327. buf    (x)    /
  2328. nbytes    x    /
  2329. flags    x    /
  2330. Snd is used by the client of a connection-oriented stream protocol to send either normal or expedited data. On successful completion, Snd returns an integer value of zero or greater, indicating the number of bytes sent. On error, Snd returns a negative integer corresponding to a result code.
  2331. To specify the data to be sent, the client passes a pointer to data and a length. The client may specify any optional flags in the flags parameter:
  2332. T_EXPEDITED    If set, the data will be sent as expedited data (if supported by the endpoint)
  2333. T_MORE    If set, this indicates that the transport service data unit (TSDU) or expedited transport service data unit, ETSDU) is being sent with multiple Snd calls. Each Snd with the T_MORE flag set indicates that another Snd will follow with more data for the current TSDU.
  2334.     The end of the TSDU (or ETSDU) is identified with a Snd call with the T_MORE flag not set. Use of T_MORE allows the client to break up large logical data units without losing the boundaries of those units at the other end of the connection. The flag implies nothing about how the data is packaged for transfer below the endpoint. If the endpoint does not support the concept of TSDU as indicated in the info field of a TEndpointInfo structure filled out by either the OpenEndpoint or GetEndpointInfo functions, the T_MORE flag is not meaningful and will be ignored if set.
  2335.     The sending of a zero length fragment of a TSDU or ETSDU is permitted only where this is used to indicate the end of a TSDU or ETSDU, that is when the T_MORE flag is not set. Some endpoints forbid the zero length TSDUs and ETSDUs. In this case a kOTBadDataErr error will result.
  2336. If the endpoint is in non-blocking or asynchronous mode,  it is possible that only part of the data will actually be accepted by the transport provider.  In this case, OTSnd will return a value that is less than the value of the nbytes parameter, or the error kOTFlowErr  if no bytes at all were sent.  After this error occurs, a T_GODATA event will be issued when the flow control restrictions are lifted. This error will never be returned if the endpoint is in blocking mode.
  2337. If an asynchronous event, such as a disconnect event, occurs which interrupts the Snd function, it will return with the kOTLookErr result.
  2338. The behavior of Snd is summarized in the table below.
  2339.  
  2340. Sync/Blocking    kOTFlowErr never returned
  2341. Returns when flow control lifts
  2342.  
  2343. Sync/Non-Blocking    kOTFlowErr may be returned
  2344. Returns to caller immediately
  2345.  
  2346. Async/Blocking    kOTFlowErr may be returned
  2347. Returns to caller immediately
  2348.  
  2349. Async/Non-Blocking    kOTFlowErr may be returned
  2350. Returns to caller immediately
  2351.  
  2352.  
  2353. The client may negotiate the XTI_SNDLOWAT option with an endpoint using the OptionManagement function. This option value gives the minimal number of bytes that must have accumulated in the endpoint’s send buffer before they are sent. Not all endpoints support the XTI_RCVLOWAT option.
  2354. If the function fails with the result code kOTBadDataErr, one of the following conditions occurred:
  2355.     •    A single send was attempted specifying a TSDU(ETSDU) or fragment TSDU(ETSDU) greater than that specified by the current values for TSDU or ETSDU for this endpoint.
  2356.     •    A send of a zero-byte TSDU(ETSDU) or zero byte fragment of a TSDU(ETSDU) is not supported by this endpoint.
  2357.     •    Multiple sends were attempted, resulting in a TSDU(ETSDU) larger than that specified by the current values of TSDU or ETSDU for this endpoint.
  2358. Valid States
  2359. T_DATAXFER, T_INREL
  2360. RESULT CODES
  2361. kOTBadDataErr
  2362. kOTBadFlagErr
  2363. kOTCanceledErr
  2364. kOTFlowErr
  2365. kOTLookErr
  2366. kOTNotSupportedErr
  2367. kOTOutStateErr
  2368. See Also
  2369. AckSends, GetEndpointInfo, Rcv
  2370. .c3..i.Rcv;
  2371. FUNCTION
  2372. Rcv    Read data on a connection-oriented stream.
  2373. C INTERFACE
  2374. OTResult    OTRcv(EndpointRef ref, void* buf, size_t nbytes, OTFlags* flags);
  2375. C++ INTERFACE
  2376. OTResult    TEndpoint::Rcv(void* buf, size_t nbytes, OTFlags* flags);
  2377. Description
  2378. Parameters    Before
  2379. Call    After
  2380. Call
  2381. ref (C only)    x    /
  2382. buf    x    (x)
  2383. nbytes    x    /
  2384. flags    x    (x)
  2385. Rcv receives either normal or expedited data. On successful completion, Rcv returns an integer value of zero or greater, indicating the number of bytes received. On error, Rcv returns a negative integer corresponding to a result code.
  2386. The client must specify an area in memory to which the data should be copied.
  2387. On return, if T_MORE  is set in the flags, this indicates that there is more data, and the current transport service data unit (TSDU) or expedited transport service data unit (ETSDU) must be received in multiple Rcv calls. In asynchronous mode, T_MORE may be set on return even when the number of bytes received is less than the size of the receive buffer specified. Each Rcv with the T_MORE flag set indicates that another Rcv must follow to get more data for the current TSDU. The end of the TSDU is identified by the return of a Rcv call with the T_MORE flag not set. If the endpoint does not support the concept of a TSDU, the T_MORE flag is not meaningful and should be ignored. If the client requests more than zero bytes on the call to Rcv, then the function will return zero only if the end of a TSDU is being returned to the client.
  2388. On return, the data is expedited data if T_EXPEDITED is set in flags. If the number of bytes of expedited data exceeds the number of bytes requested in reqCount, the T_EXPEDITED and T_MORE flags will both be set. Subsequent calls to Rcv to will return the remaining ETSDU.
  2389. Note: If the client is in the middle of reading normal data TSDU, and then a Rcv returns expedited data, the next Rcv that returns without the T_EXPEDITED flag will return normal data at the place it was interrupted. It is the responsibility of the client to remember their place in the normal data stream when interrupted by expedited data.
  2390. The reqCount parameter is filled in with the actual number of bytes read.
  2391. If the client has installed a notification routine , the T_DATA or T_EXDATA events will be issued when there is data available. If no notification routine is installed, the client may poll for these events by repeatedly calling the Look function.
  2392. If the endpoint is in synchronous mode and is blocking, the endpoint will wait for data if none is currently available. Generally, this method of operation is discouraged as it may lead to a ‘hang’ if no data ever becomes available. If the client is doing other operations in synchronous mode, it should put the endpoint in non-blocking mode before making the Rcv call.
  2393. If the endpoint is in asynchronous mode or is not blocking, the function will fail with the kOTNoDataErr result if no data is available. Once a client gets the T_DATA event, it should continue in a loop making the RcvUData call until a kOTNoDataErr error is returned.
  2394. Clients should be prepared for a T_DATA event and then a kOTNoDataErr error when a Rcv call is made. This seems unusual, but it can occur if you are calling Rcv in the foreground when a T_DATA event comes in.
  2395. One other situation that is worth noting is that a Rcv can get a kOTLookErr error returned from the call.  It is VERY important that you actually do the OTLook.  If you are in a flow-control situation on the send side, and a T_GODATA or T_GOEXDATA event occurs that you do not clear in your notifier (by calling OTLook or by actually sending some data), then if you do not do the OTLook in response to a kOTLookErr error from a Rcv call, you will hang waiting for events.  Until the T_GODATA or T_GOEXDATA are cleared, Open Transport cannot send you another T_DATA event (or any other event other than a T_DISCONNECT, for that matter).
  2396. The client may negotiate the XTI_RCVLOWAT option with an endpoint using the OptionManagement function. This option value gives the minimal number of bytes that must have accumulated in the endpoint’s receive buffer before a T_DATA event is issued. Not all endpoints support the XTI_RCVLOWAT option.
  2397. Valid States
  2398. T_DATAXFER, T_OUTREL
  2399. RESULT CODES
  2400. kOTCanceledErr
  2401. kOTLookErr
  2402. kOTNoDataErr
  2403. kOTNotSupportedErr
  2404. kOTOutStateErr
  2405. See Also
  2406. Look, SetAsynchronous, SetBlocking, Snd
  2407.  
  2408. .c2. Processing Transactions
  2409. This section describes how a client uses the Open Transport transaction protocol calls to transfer data between two endpoints. A client can either actively initiate a transaction request, or it can passively wait for an endpoint to receive an incoming transaction request. Each transaction is assigned a unique sequence number to identify it for issuing/receiving the reply. There can be any number of transactions outstanding at the same time.
  2410. .c3.Initiating a Transaction Request;
  2411. In order to initiate a transaction request on an endpoint, the client must first bind the endpoint with the Bind function.
  2412. The client uses the SndURequest function to initiate a transaction. The parameters to the call include the address of the remote end, any data to send along with the transaction request (if the particular protocol the endpoint implements allows it), and any options that the client wants to specify.
  2413. Transactions come in two types: acknowledged and unacknowledged.  The default is unacknowledged.  Set the T_ACKNOWLEDGED bit in the OTFlags parameter of the SndURequest to get acknowledged transactions.  From the client's perspective the only difference between the two is that when a reply is sent to an incoming acknowledged request, the SndUReply function does not complete until the reply is acknowledged.  In this case, kOTNoError will be returned if the reply was acknowledged, and kETIMEDOUTErr will be returned if the transaction protocol timed out waiting for acknowledgment.  For unacknowledged transactions, the SndUReply function completes immediately.
  2414. There is no difference between issuing requests and receiving responses in synchronous or asynchronous modes.
  2415. The sequence below shows the order of events for a successful transaction request.
  2416.         Local                        Remote
  2417. Client makes a SndURequest call, which returns immediately with no error.
  2418. The remote client’s notification routine is called with a T_REQUEST event. 
  2419. Remote end issues a RcvURequest, formulates a response, issues a SndUReply with the requested data (and sequence # identifier)
  2420. Client  receives a T_REPLY event and issues RcvUReply to receive the reply.  kOTNoError is returned and the TUnitReply structure contains the reply information.
  2421.  
  2422. If remote end rejects the transaction request, or the request fails in some other way, this is the sequence of events:
  2423.         Local                        Remote
  2424. Client makes a SndURequest call, which returns immediately with no error.
  2425. The remote client’s notification routine is called with a T_REQUEST event. 
  2426. Remote end rejects the transaction request.
  2427. The protocol will retry the request to protocol specification.
  2428.  
  2429. Client  receives a T_REPLY event and issues RcvUReply to receive the reply.  A kETIMEDOUTErr is returned, and the TUnitReply structure contains no useful information other than the sequence number of the corresponding SndURequest.
  2430. .c3.Responding to a Transaction Request;
  2431. In order to respond to a transaction request on an endpoint, the client must first bind the endpoint with the Bind function.
  2432. Synchronous clients in blocking mode may issue a RcvURequest call to wait for an incoming request.
  2433. Clients will receive a T_REQUEST event notification when a transaction request arrives (unless a RcvURequest call is in progress by a synchronous, blocking client). The client must issue the RcvURequest function to retrieve the information associated with the transaction request. This information includes the remote address, any options associated with the request, any data associated with the request, and a sequence number.
  2434. The client can either reject the incoming transaction request by calling CancelUReply, or the client can accept the incoming transaction request, formulate an appropriate response, and reply by calling the SndUReply function and passing the sequence number returned from the RcvURequest function to indicate which transaction request the reply is for.
  2435. Synchronous/Blocking Response
  2436. The sequence of events for handling an incoming transaction request in synchronous mode is shown below
  2437.         Local                        Remote
  2438. Client makes a Bind call.
  2439. Client makes a RcvURequest call.
  2440. Remote end uses SndURequest to send a transaction request.
  2441. RcvURequest returns to client with request info and sequence #.
  2442. Client makes an SndUReply call to respond to the request.  If this was an acknowledged request, the SndUReply will complete with either kOTNoError if the reply was acknowledged, or kETIMEDOUTErr if it was not.
  2443. Remote end’s notification routine  is called with T_REPLY to indicate that reply data is available.  RcvUReply is called to receive the reply data.
  2444. Asynchronous Response
  2445. The sequence of events for accepting an incoming transaction request in asynchronous mode is shown below
  2446.         Local                        Remote
  2447. Client makes a Bind call. The local end is now ready to receive incoming transaction requests.
  2448. Remote end uses SndURequest to send a transaction request.
  2449. The client’s notification routine is called with a T_REQUEST event.
  2450. Client makes a RcvURequest call to obtain request info and sequence #. 
  2451. Client makes an SndUReply call to respond to the request.
  2452. Remote end’s notification routine is called with T_REPLY to indicate the SndURequest call has completed.
  2453. The client’s notification routine is called with T_REPLYCOMPLETE and the cookie containing the sequence value generated by the client for the corresponding request.  The result code will be either kOTNoError if the reply was acknowledged, or kETIMEDOUTErr if it was not
  2454. .c2.Connectionless Transactions
  2455. Open Transport supports connectionless transaction endpoints. The Open Transport functions specific to this type of endpoint are SndURequest, RcvURequest, SndUReply, and RcvUReply.
  2456. SndURequest is used by a client to initiate a transaction;  the SndURequest function must have a unique (among all currently outstanding outgoing requests) non-zero sequence number value filled out in the TUnitReply structure. The sequence number is required, since multiple requests may be outstanding at any time, and replies may not arrive in the order that the requests were issued.  The RcvUReply function is used to read incoming replies.  Since incoming replies do not necessarily arrive in the same order as the requests were sent, it is necessary to be prepared to receive a reply to any outstanding requests.  One method for dealing with this is to call RcvUReply with no data buffer.  This will result in the sequence number being stored in the TUnitReply structure, and the T_MORE flag being set in the OTFlags parameter (unless an error occurred).  Once a reply has been partially received with the T_MORE flag being set, it is guaranteed that subsequent calls to RcvUReply will read from the same reply, until the function returns with the T_MORE flag cleared.
  2457. The endpoint that is the destination of a transaction request reads the request using the RcvURequest function. A sequence number is returned along with the request data; the responding client must return this sequence number along with the response data when making the SndUReply function so that the endpoint can determine which request the client is responding to. This sequence number is required because one endpoint (depending upon the implementation) may have more than one concurrent transaction outstanding at any given time. A responding client need not respond to requests in the order received.
  2458. .c3..i.SndURequest;
  2459. FUNCTION
  2460. SndURequest    Send a unit request.
  2461. C INTERFACE
  2462. OSStatus    OTSndURequest(EndpointRef ref, TUnitRequest* req, OTFlags reqFlags);
  2463. C++ INTERFACE
  2464. OSStatus    TEndpoint::SndURequest(TUnitRequest* req, OTFlags reqFlags);
  2465. Description
  2466. Parameters    Before
  2467. Call    After
  2468. Call
  2469. ref (C only)    x    /
  2470. req>addr.maxlen    /    /
  2471. req>addr.len    x >= 0    /
  2472. req>addr.buf    (x)    /
  2473. req>opt.maxlen    /    /
  2474. req>opt.len    x >= 0    /
  2475. req>opt.buf    (?)    /
  2476. req>udata.maxlen    /    /
  2477. req>udata.len    x >= 0    /
  2478. req>udata.buf    (x)    /
  2479. req>sequence    x    /
  2480. reqFlags    x    /
  2481. SndURequest is used by the client of a connectionless transaction endpoint to send a unit request to another endpoint. The client passes a TUnitRequest structure and reqFlags that contain the remote address, the request data, any options, and flags.
  2482. The TUnitRequest structure has the following members:
  2483. struct TNetbuf addr;
  2484. struct TNetbuf opt;
  2485. struct TNetbuf udata;
  2486. OTSequence sequence;
  2487. The addr member contains the protocol address of the destination of the request. The addr.len field holds the length of the protocol address.
  2488. The opt member contains any protocol-specific options for the request. The opt.len field holds the length of the options, or zero if there are none.
  2489. The udata member contains the request data. The udata.len field specifies the length of the request. This value must not exceed the one returned in the etsu field of the TEndpointInfo structure filled in by OpenEndpoint or GetEndpointInfo. 
  2490. A client may send non-contiguous data by setting the req->udata.buf pointer to point to an OTData structure, and setting the req->udata.len value to kNetbufDataIsOTData
  2491. The sequence field should be set to a non-zero value that will uniquely identify this request from all other outstanding requests on the endpoint.
  2492. The only defined flag for SndURequest are the T_ACKNOWLEDGED  and T_MORE flags.  The T_MORE flag indicates that more request data will be sent  in a subsequent SndURequest call.  The T_ACKNOWLEDGED flag indicates that the request is required to be acknowledged.  This flag may not be honored by all transaction protocols.  
  2493. If the endpoint is in non-blocking or asynchronous mode, the SndURequest function will return a kOTFlowErr if flow control restrictions prevent the data from being accepted by the transport provider at the time the function is issued.  After this error occurs, a T_GODATA event will be issued when the flow control restrictions are lifted. This error will never be returned if the endpoint is in blocking mode.
  2494. The behavior of SndURequest is summarized in the table below.
  2495.  
  2496. Sync/Blocking    kOTFlowErr never returned
  2497. Returns when flow control lifts and the request data has been sent to the protocol.
  2498.  
  2499. Sync/Non-Blocking    kOTFlowErr may be returned
  2500. Returns if flow control restrictions are in effect or the request data has been sent to the protocol.
  2501.  
  2502. Async/Blocking    kOTFlowErr may be returned
  2503. Returns to caller immediately
  2504.  
  2505. Async/Non-Blocking    kOTFlowErr may be returned
  2506. Returns to caller immediately
  2507.  
  2508. Valid States
  2509. T_IDLE
  2510. RESULT CODES
  2511. kOTBadAddressErr
  2512. kOTBadFlagErr
  2513. kOTBadOptionErr
  2514. kOTCanceledErr
  2515. kOTFlowErr
  2516. kOTLookErr
  2517. kOTNotSupportedErr
  2518. kOTOutStateErr
  2519. See Also
  2520. RcvURequest, RcvUReply
  2521. .c3..i.RcvURequest;
  2522. FUNCTION
  2523. RcvURequest    Read an incoming unit request.
  2524. C INTERFACE
  2525. OSStatus    OTRcvURequest(EndpointRef ref, TUnitRequest* req, OTFlags* flags);
  2526. C++ INTERFACE
  2527. OSStatus    TEndpoint::RcvURequest(TUnitRequest* req, OTFlags* flags);
  2528. Description
  2529. Parameters    Before
  2530. Call    After
  2531. Call
  2532. ref (C only)    x    /
  2533. req>addr.maxlen    x    /
  2534. req>addr.len    /    x
  2535. req>addr.buf    ?    (?)
  2536. req>opt.maxlen    x    /
  2537. req>opt.len    /    x
  2538. req>opt.buf    ?    (?)
  2539. req>udata.maxlen    x    /
  2540. req>udata.len    /    x
  2541. req>udata.buf    ?    (?)
  2542. req>sequence    /    x
  2543. flags    /    x
  2544. RcvURequest is used by a client of a connectionless transaction endpoint to read a unit request. The client supplies a TUnitRequest structure that will be filled out with the protocol address of the originator of the request, any options associated with the request, the request data, and a sequence number to be passed back to the endpoint when a client makes a reply.
  2545. If the endpoint is in synchronous mode and is blocking, this function will wait for a request to arrive. If the endpoint is in asynchronous mode or is not blocking, the function will return any unread requests and the kOTNoDataErr result if there are no unread requests.
  2546. The endpoint will generate a T_REQUEST event when a request arrives. The client may poll for the arrival of a request by making the Look function or repeatedly calling this function for as long as the kOTNoDataErr result is returned. If the client has a notification routine  installed on the endpoint, the event will be sent to the notification routine .
  2547. The TUnitRequest structure has the following members:
  2548. struct TNetbuf addr;
  2549. struct TNetbuf opt;
  2550. struct TNetbuf udata;
  2551. OTSequence sequence;
  2552. The addr member will be filled in with the protocol address of the originator of the request. The addr.maxlen field must be large enough to hold the protocol address or a kOTBufferOverflowErr error will result and the incoming request will be dropped.
  2553. The opt member contains any protocol-specific options for the request. The opt.maxlen field must be large enough to hold the options.
  2554. The udata member will be filled in with the request data.
  2555. The udata.buf field points to a client-supplied buffer of size udata.maxlen; this buffer holds the reply. To hold the largest possible reply, the udata.maxlen field should be set to a value equal to that of the tsdu field in the TEndpointInfo structure filled in by OpenEndpoint or GetEndpointInfo.
  2556. The sequence member will be filled out with the endpoint-assigned sequence number for the transaction. This sequence number must be passed by the client to the SndUReply function when sending the transaction reply, or to the CancelUReply function to cancel the transaction.
  2557. The flags parameter will be filled in with the T_MORE flag if the client-supplied buffer is not large enough to hold the entire request. The client must reissue the RcvURequest function to retrieve the rest of the request. The addr and options fields will be ignored on these subsequent calls to RcvURequest.  
  2558. The flags parameter may also contain the T_ACKNOWLEDGED bit if the request has been identified as an acknowledged request rather than an unacknowledged request.  This bit will only be set on the first call to RcvURequest.  
  2559. In addition, the flags parameter may also contain the T_PARTIALDATA bit.  In this case, the request data being received is only partial, and there is more coming, but it has not yet arrived.   The difference between T_MORE and T_PARTIALDATA is that the T_MORE indicates that there is more data, and the next call to RcvURequest will read that data, while the T_PARTIALDATA flag does not have that guarantee.  Like the T_ACKNOWLEDGED bit, the T_PARTIALDATA bit will only be set on the first call to RcvURequest.
  2560. Valid States
  2561. T_IDLE
  2562. RESULT CODES
  2563. kOTBadReferenceErr
  2564. kOTBadSyncErr
  2565. kOTCanceledErr
  2566. kOTLookErr
  2567. kOTNoDataErr
  2568. kOTNotSupportedErr
  2569. kOTOutStateErr
  2570. See Also
  2571. SndURequest, SndUReply, RcvUReply
  2572. .c3..i.SndUReply;
  2573. FUNCTION
  2574. SndUReply    Send a unit reply.
  2575. C INTERFACE
  2576. OSStatus    OTSndUReply(EndpointRef ref, TUnitReply* reply, OTFlags flags);
  2577. C++ INTERFACE
  2578. OSStatus    TEndpoint::SndUReply(TUnitReply* reply, OTFlags flags);
  2579. Description
  2580. Parameters    Before
  2581. Call    After
  2582. Call
  2583. ref (C only)    x    /
  2584. reply>opt.maxlen    /    /
  2585. reply>opt.len    x    /
  2586. reply>opt.buf    (x)    /
  2587. reply>udata.maxlen    /    /
  2588. reply>udata.len    x    /
  2589. reply>udata.buf    (x)    /
  2590. reply>sequence    x    /
  2591. flags    x    /
  2592. SndUReply is used by the client of a connectionless transaction endpoint to send a reply in response to an incoming request. The client passes a TUnitReply structure containing the following members:
  2593. struct TNetbuf udata;
  2594. struct TNetbuf opt
  2595. OTSequence sequence;
  2596. The udata TNetbuf contains the reply data. The reply data is pointed to by the udata.buf field. 
  2597. A client may send non-contiguous data by setting the reply->udata.buf pointer to point to an OTData structure, and setting the reply->udata.len value to kNetbufDataIsOTData
  2598. The opt TNetbuf contains any options that apply to the reply.
  2599. The client must pass the sequence number returned by the RcvURequest function in the sequence parameter.
  2600. The client does not need to specify the remote address; the endpoint uses the sequence to match the reply against a pending request, so the endpoint knows where to send the response.
  2601. The behavior of SndUReply is summarized in the table below.
  2602.  
  2603. Sync/Blocking    kOTFlowErr never returned
  2604. Returns when flow control lifts and the reply has been acknowledged or timed out(if the matching request was an acknowledged request)
  2605.  
  2606. Sync/Non-Blocking    kOTFlowErr may be returned
  2607. Returns to caller immediately for unacknowledged requests, and when the reply has been acknowledged or timed out for acknowledged requests.
  2608.  
  2609. Async/Blocking    kOTFlowErr may be returned
  2610. Returns to caller immediately
  2611. A T_REPLYCOMPLETE event is sent to the notification routine when the reply is acknowledged or timed out.
  2612. Async/Non-Blocking    kOTFlowErr may be returned
  2613. Returns to caller immediately
  2614. A T_REPLYCOMPLETE event is sent to the notification routine when the reply is acknowledged or timed out.
  2615. If the reply was not successfully sent (i.e. timed out - only for acknowledged requests), the result parameter will be set to kETIMEDOUTErr.  For unacknowledged requests, a T_REPLYCOMPLETE  event will still be generated for asynchronous clients so that the logic is the same for replying to both acknowledged and unacknowledged requests.
  2616. The cookie parameter passed to the notification routine to indicate completion will be set to the the sequence value generated by the client for the corresponding request. (  In cases where T_MORE is used to send the reply in multiple "chunks", the first TUnitReply* is used).
  2617. Valid States
  2618. T_IDLE
  2619. RESULT CODES
  2620. kOTBadFlagErr
  2621. kOTBadSequenceErr
  2622. kOTCanceledErr
  2623. kOTLookErr
  2624. kOTNotSupportedErr
  2625. kOTOutStateErr
  2626. See Also
  2627. RcvURequest
  2628. .c3..i.RcvUReply;
  2629. FUNCTION
  2630. RcvUReply    Receive a unit reply.
  2631. C INTERFACE
  2632. OSStatus    OTRcvUReply(EndpointRef ref, TUnitReply* reply, OTFlags* replyFlags);
  2633. C++ INTERFACE
  2634. OSStatus    TEndpoint::RcvUReply(TUnitReply* reply, OTFlags* replyFlags);
  2635. Description
  2636. Parameters    Before
  2637. Call    After
  2638. Call
  2639. ref (C only)    x    /
  2640. reply>opt.maxlen    x    /
  2641. reply>opt.len    /    x
  2642. reply>opt.buf    x    (x)
  2643. reply>udata.maxlen    x    /
  2644. reply>udata.len    /    x
  2645. reply>udata.buf    x    (x)
  2646. reply>sequence    /    x
  2647. replyFlags    x    (x)
  2648. RcvUReply is used by the client of a connectionless transaction endpoint to receive a reply generated by a call to SndURequest. The client passes a TUnitReply structure containing the following members:
  2649. struct TNetbuf udata;
  2650. struct TNetbuf opt
  2651. OTSequence sequence;
  2652. The udata TNetbuf contains the buffer for the reply data. The reply data will be pointed to by the udata.buf field. 
  2653. The opt TNetbuf contains any options that apply to the reply.
  2654. The sequence field will be filled in with the sequence number of the matching SndURequest.
  2655. The flags parameter will be filled in with the T_MORE bit set if the RcvUReply call did not read all of the reply data.
  2656. Since it is not possible to know ahead of time which request the incoming reply will match, the client must be prepared to receive a reply to any outstanding request.  One way to deal with this is to first call RcvUReply with a zero value in reply->udata.maxlen.  This will return the sequence number and the option information, as well as setting the T_MORE flag (unless an error occurred - then there is no data to read).  Once the matching request and the appropriate reply buffer have been found, a second RcvUReply may be issued to read the actual reply data.  On these second and subsequent reads, the reply->opt.len field will be set to 0.  It is guaranteed that once a reply has been partially read and set the T_MORE flag, subsequent calls to RcvUReply will read from that same reply until all the data has been read.
  2657.  In addition, the flags parameter may also contain the T_PARTIALDATA bit.  In this case, the reply data being received is only partial, and there is more coming, but it has not yet arrived.   The difference between T_MORE and T_PARTIALDATA is that the T_MORE indicates that there is more data, and the next call to RcvUReply will read that data, while the T_PARTIALDATA flag does not have that guarantee.  The T_PARTIALDATA bit will only be set on the first call to RcvUReply.  
  2658. Clients in asynchronous mode will receive a T_REPLY event to indicate that incoming reply data is available.  Once this occurs, RcvUReply should be called repeatedly to read data until it returns a kOTNoDataErr.  Otherwise, no future T_REPLY events will be received.
  2659. If a transaction has timed out awaiting reply data, the RcvUReply function will return a kETIMEDOUTErr, and the reply->sequence field will indicate which request timed out.
  2660. Valid States
  2661. T_IDLE
  2662. RESULT CODES
  2663. kOTBadSequenceErr
  2664. kOTCanceledErr
  2665. kOTLookErr
  2666. kOTNoDataErr
  2667. kETIMEDOUTErr
  2668. See Also
  2669. SndURequest
  2670. .c3..i.CancelURequest;
  2671. FUNCTION
  2672. CancelURequest    Cancel an outstanding SndURequest.
  2673. C INTERFACE
  2674. OSStatus    OTCancelURequest(EndpointRef ref, OTSequence seq);
  2675. C++ INTERFACE
  2676. OSStatus    TEndpoint::CancelURequest(OTSequence seq);
  2677. Description
  2678. Parameters    Before
  2679. Call    After
  2680. Call
  2681. ref (C only)    x    /
  2682. seq    x    .
  2683. CancelURequest is used by the client of a connectionless transaction endpoint to cancel an outstanding outgoing request function (a call to SndURequest).   Calling this function tells the protocol that this transaction is no longer of interest, and allows it to free up any memory associated with this transaction  There is no acknowledgment from this function.  If the sequence number indicated is not a valid sequence number, then nothing will be done.
  2684. It is the responsibility of the client to destroy any data structures associated with the canceled request.
  2685. If the value of the seq parameter is set to zero, then ALL outstanding SndURequest functions will be canceled.
  2686. Be sure to call CancelUReply if you are canceling an incoming request.  This is necessary because the OTSequence value of incoming requests are generated by the protocol, while the OTSequence value of outgoing requests are generated by the client, and they may overlap.
  2687. Valid States
  2688. T_IDLE
  2689. RESULT CODES
  2690. kENOSRErr
  2691. See Also
  2692. CancelUReply
  2693. .c3..i.CancelUReply;
  2694. FUNCTION
  2695. CancelUReply    Cancel an outstanding RcvURequest.
  2696. C INTERFACE
  2697. OSStatus    OTCancelUReply(EndpointRef ref, OTSequence seq);
  2698. C++ INTERFACE
  2699. OSStatus    TEndpoint::CancelUReply(OTSequence seq);
  2700. Description
  2701. Parameters    Before
  2702. Call    After
  2703. Call
  2704. ref (C only)    x    /
  2705. seq    x    .
  2706. CancelUReply is used by the client of a connectionless transaction endpoint to cancel an outstanding incoming request (received by RcvURequest).   Calling this function tells the protocol that this transaction is no longer of interest, and allows it to free up any memory associated with this transaction.  There is no acknowledgment from this function.  If the sequence number indicated is not a valid sequence number, then nothing will be done.
  2707. It is the responsibility of the client to destroy any data structures associated with the canceled request.
  2708. If the value of the seq parameter is set to zero, then ALL outstanding incoming requests will be canceled.
  2709. Be sure to call CancelURequest if you are canceling an outgoing request.  This is necessary because the OTSequence value of incoming requests are generated by the protocol, while the OTSequence value of outgoing requests are generated by the client, and they may overlap.
  2710.  
  2711. Valid States
  2712. T_IDLE
  2713. RESULT CODES
  2714. kENOSRErr
  2715. See Also
  2716. CancelURequest
  2717.  
  2718. .c2.Connection-Oriented Transactions;.i.Transaction:Connection-Oriented;
  2719. Open Transport supports connection-oriented transaction endpoints. The functions specific to this type of endpoint are SndRequest, RcvRequest, SndReply, and CancelRequest.
  2720. .c3..i.SndRequest;
  2721. FUNCTION
  2722. SndRequest    Send a request.
  2723. C INTERFACE
  2724. OSStatus    OTSndRequest(EndpointRef ref, TRequest* req, OTFlags reqFlags);
  2725. C++ INTERFACE
  2726. OSStatus    TEndpoint::SndRequest(TRequest* req, OTFlags reqFlags);
  2727. Description
  2728. Parameters    Before
  2729. Call    After
  2730. Call
  2731. ref (C only)    x    /
  2732. req>data.maxlen    /    /
  2733. req>data.len    x     /
  2734. req>data.buf    (x)    /
  2735. req>opt.maxlen    /    /
  2736. req>opt.len    x >= 0    /
  2737. req>opt.buf    (x)    /
  2738. req>sequence    x    /
  2739. reqFlags    x    /
  2740. SndRequest is used by the client of a connection-oriented transaction endpoint to send a request to an endpoint on the other end of the connection. The client passes a TRequest structure and reqFlags parameter that contain the request data, options, and flags. 
  2741. The TRequest structure has the following members:
  2742. struct TNetbuf data;
  2743. struct TNetbuf opts
  2744. OTSequence sequence;
  2745. The data member contains the request data. If the data.len field is non-negative, the data.buf field contains a pointer to the request data. 
  2746. A client may send non-contiguous data by setting the req->udata.buf pointer to point to an OTData structure, and setting the req->udata.len value to kNetbufDataIsOTData
  2747. The sequence field should be set to a non-zero value that will uniquely identify this request from all other oustanding requests on the endpoint.
  2748. The only defined flag for SndRequest is the T_MORE flags.  The T_MORE flag indicates that more request data will be sent  in a subsequent SndRequest call.  
  2749. If the endpoint is in non-blocking or asynchronous mode, the SndRequest function will return a kOTFlowErr if flow control restrictions prevent the data from being accepted by the transport provider at the time the function is issued.  After this error occurs, a T_GODATA event will be issued when the flow control restrictions are lifted. This error will never be returned if the endpoint is in blocking mode.
  2750. The behavior of SndRequest is summarized in the table below.
  2751.  
  2752. Sync/Blocking    kOTFlowErr never returned
  2753. Returns when flow control lifts and the reply has been received.
  2754.  
  2755. Sync/Non-Blocking    kOTFlowErr may be returned
  2756. Returns if flow control restrictions are in effect or when the reply has been received.
  2757.  
  2758. Async/Blocking    kOTFlowErr may be returned
  2759. Returns to caller immediately
  2760. T_REPLY events may be sent to the notification routine as reply data becomes available
  2761.  
  2762. Async/Non-Blocking    kOTFlowErr may be returned
  2763. Returns to caller immediately
  2764. T_REPLY events may be sent to the notification routine as reply data becomes available
  2765.  
  2766. Valid States
  2767. T_DATAXFER, T_INREL
  2768. RESULT CODES
  2769. kOTBadFlagErr
  2770. kOTBufferOverflowErr
  2771. kOTCanceledErr
  2772. kOTFlowErr
  2773. kOTLookErr
  2774. kOTNotSupportedErr
  2775. kOTOutStateErr
  2776. See Also
  2777. RcvRequest, SndReply, RcvReply
  2778. .c3..i.RcvRequest;
  2779. FUNCTION
  2780. RcvRequest    Read an incoming request.
  2781. C INTERFACE
  2782. OSStatus    OTRcvRequest(EndpointRef ref, TRequest* req, OTFlags* flags);
  2783. C++ INTERFACE
  2784. OSStatus    TEndpoint::RcvRequest(TRequest* req, OTFlags* flags);
  2785. Description
  2786. Parameters    Before
  2787. Call    After
  2788. Call
  2789. ref (C only)    x    /
  2790. req>data.maxlen    x    /
  2791. req>data.len    /    x
  2792. req>data.buf    (?)    (x)
  2793. req>opt.maxlen    x    /
  2794. req>opt.len    /    x
  2795. req>opt.buf    ?    (?)
  2796. req>sequence    /    x
  2797. flags    /    x
  2798. RcvRequest is used by a client of a connection-oriented transaction endpoint to read an incoming request. The client supplies a TRequest structure that will be filled out with the request data, options,  and a sequence number to be passed back to the endpoint when a client makes a reply.
  2799. If the endpoint is in synchronous mode and is blocking, this function will wait for a request to arrive. If the endpoint is in asynchronous mode or is not blocking, the function will return any unread requests and the kOTNoDataErr result if there are no unread requests.
  2800. The endpoint will generate a T_REQUEST event when a request arrives. The client may poll for the arrival of a request by making the Look function or repeatedly calling this function for as long as the kOTNoDataErr result is returned. If the client has a notification routine  installed on the endpoint, the event will be sent to the notification routine .
  2801. The TRequest structure has the following members:
  2802. struct TNetbuf data;
  2803. struct TNetbuf opt;
  2804. OTSequence sequence;
  2805. The data member will be filled in with the request data. The data.buf field points to a client-supplied buffer of size data.maxlen to hold the request. 
  2806. The sequence member will be filled out with the endpoint-assigned sequence number for the transaction. This sequence number must be passed by the client to the SndReply function when sending the transaction reply.
  2807. The flags parameter will be filled in with the T_MORE flag if the client-supplied buffer is not large enough to hold the entire request. The client must reissue the RcvRequest function to retrieve the rest of the request. The options field will be ignored on these calls to RcvRequest.
  2808. In addition, the flags parameter may also contain the T_PARTIALDATA bit.  In this case, the request data being received is only partial, and there is more coming, but it has not yet arrived.   The difference between T_MORE and T_PARTIALDATA is that the T_MORE indicates that there is more data, and the next call to RcvRequest will read that data, while the T_PARTIALDATA flag does not have that guarantee.  The T_PARTIALDATA bit will only be set on the first call to RcvRequest.  All subsequent calls to RcvRequest are guaranteed to continue reading the partial data in question until the RcvRequest returns without the T_MORE flag set.
  2809.  
  2810. Valid States
  2811. T_DATAXFER, T_OUTREL
  2812. RESULT CODES
  2813. kOTBufferOverflowErr
  2814. kOTCanceledErr
  2815. kOTLookErr
  2816. kOTNoDataErr
  2817. kOTNotSupportedErr
  2818. kOTOutStateErr
  2819. See Also
  2820. SndRequest
  2821. .c3..i.SndReply;
  2822. FUNCTION
  2823. SndReply    Send a reply.
  2824. C INTERFACE
  2825. OSStatus    OTSndReply(EndpointRef ref, TReply* reply, OTFlags flags);
  2826. C++ INTERFACE
  2827. OSStatus    TEndpoint::SndReply(TReply* reply, OTFlags flags);
  2828. Description
  2829. Parameters    Before
  2830. Call    After
  2831. Call
  2832. ref (C only)    x    /
  2833. reply>data.maxlen    /    /
  2834. reply>data.len    x    /
  2835. reply>data.buf    (x)    /
  2836. reply->opt.maxlen    /    /
  2837. reply->opt.len    x    /
  2838. reply->opt.buf    (x)    /
  2839. reply>sequence    x    /
  2840. flags    x    /
  2841. SndReply is used by the client of a connection-oriented transaction endpoint to send a reply in response to an incoming request. The client passes a TReply structure containing the following members:
  2842. struct TNetbuf data;
  2843. struct TNetbuf opt;
  2844. OTSequence sequence;
  2845. The data TNetbuf contains the reply data. The reply data is pointed to by the udata.buf field. 
  2846. A client may send non-contiguous data by setting the reply->data.buf pointer to point to an OTData structure, and setting the reply->data.len value to kNetbufDataIsOTData
  2847. The opt TNetbuf contains any options that apply to the reply.
  2848. The client must pass the sequence number returned by the RcvRequest function in the sequence parameter.
  2849. The behavior of SndReply is summarized in the table below.
  2850.  
  2851. Sync/Blocking    kOTFlowErr never returned
  2852. Returns when flow control lifts and the reply has been successfully sent or timed out.
  2853.  
  2854. Sync/Non-Blocking    kOTFlowErr may be returned
  2855. Returns if flow control restrictions are in effect or when the reply has been successfully sent or timed out.
  2856.  
  2857. Async/Blocking    kOTFlowErr may be returned
  2858. Returns to caller immediately
  2859. A T_REPLYCOMPLETE event is sent to the notification routine when the reply is successfully sent or timed out.
  2860. Async/Non-Blocking    kOTFlowErr may be returned
  2861. Returns to caller immediately
  2862. A T_REPLYCOMPLETE event is sent to the notification routine when the reply is successfully sent or timed out.
  2863. If the reply was not successfully sent (i.e. timed out - only for acknowledged requests), the result parameter will be set to kETIMEDOUTErr.  For unacknowledged requests, a T_REPLYCOMPLETE  event will still be generated for asynchronous clients so that the logic is the same for replying to both acknowledged and unacknowledged requests.
  2864. The cookie parameter passed to the notification routine to indicate completion will be set to the reply parameter of the original request (In cases where T_MORE is used to send the reply in multiple "chunks", the first TReply* is used).
  2865. Valid States
  2866. T_DATAXFER, T_OUTREL
  2867. RESULT CODES
  2868. kOTBadFlagErr
  2869. kOTBadReferenceErr
  2870. kOTBadSequenceErr
  2871. kOTBadSyncErr
  2872. kOTCanceledErr
  2873. kOTLookErr
  2874. kOTNotSupportedErr
  2875. kOTOutStateErr
  2876. See Also
  2877. None
  2878. .c3..i.RcvReply;
  2879. FUNCTION
  2880. RcvReply    Receive a reply.
  2881. C INTERFACE
  2882. OSStatus    OTRcvReply(EndpointRef ref, TReply* reply, OTFlags* replyFlags);
  2883. C++ INTERFACE
  2884. OSStatus    TEndpoint::RcvReply(TReply* reply, OTFlags* replyFlags);
  2885. Description
  2886. Parameters    Before
  2887. Call    After
  2888. Call
  2889. ref (C only)    x    /
  2890. reply>opt.maxlen    x    /
  2891. reply>opt.len    /    x
  2892. reply>opt.buf    x    (x)
  2893. reply>udata.maxlen    x    /
  2894. reply>udata.len    /    x
  2895. reply>udata.buf    x    (x)
  2896. reply>sequence    x    x
  2897. replyFlags    x    (x)
  2898. RcvReply is used by the client of a connection-oriented transaction endpoint to receive a reply generated by a call to SndRequest. The client passes a TReply structure containing the following members:
  2899. struct TNetbuf udata;
  2900. struct TNetbuf opt
  2901. OTSequence sequence;
  2902. The udata TNetbuf contains the buffer for the reply data. The reply data will be pointed to by the udata.buf field. 
  2903. The opt TNetbuf contains any options that apply to the reply.
  2904. The sequence field will be filled in with the sequence number of the matching SndRequest.
  2905. The flags parameter will be filled in with the T_MORE bit set if the RcvReply call did not read all of the reply data.
  2906. Since it is not possible to know ahead of time which request the incoming reply will match, the client must be prepared to receive a reply to any outstanding request.  One way to deal with this is to first call RcvReply with a zero value in reply->udata.maxlen.  This will return the sequence number and the option information, as well as setting the T_MORE flag (unless an error occurred - then there is no data to read).  Once the matching request and the appropriate reply buffer have been found, a second RcvReply may be issued to read the actual reply data.  On these second and subsequent reads, the reply->opt.len field will be set to 0.  It is guaranteed that once a reply has been partially read and set the T_MORE flag, subsequent calls to RcvReply will read from that same reply until all the data has been read.
  2907.  In addition, the flags parameter may also contain the T_PARTIALDATA bit.  In this case, the reply data being received is only partial, and there is more coming, but it has not yet arrived.   The difference between T_MORE and T_PARTIALDATA is that the T_MORE indicates that there is more data, and the next call to RcvReply will read that data, while the T_PARTIALDATA flag does not have that guarantee.  The T_PARTIALDATA bit will only be set on the first call to RcvReply.  
  2908. Clients in asynchronous mode will receive a T_REPLY event to indicate that incoming reply data is available.  Once this occurs, RcvReply should be called repeatedly to read data until it returns a kOTNoDataErr.  Otherwise, no future T_REPLY events will be received.
  2909. If a transaction has timed out awaiting reply data, the RcvReply function will return a kETIMEDOUTErr, and the reply->sequence field will indicate which request timed out.
  2910. Valid States
  2911. T_IDLE
  2912. RESULT CODES
  2913. kOTBadSequenceErr
  2914. kOTCanceledErr
  2915. kOTLookErr
  2916. kOTNoDataErr
  2917. See Also
  2918. SndURequest
  2919. .c3..i.CancelRequest;
  2920. FUNCTION
  2921. CancelRequest    Cancel an outstanding SndRequest.
  2922. C INTERFACE
  2923. OSStatus    OTCancelRequest(EndpointRef ref, OTSequence seq);
  2924. C++ INTERFACE
  2925. OSStatus    TEndpoint::CancelRequest(OTSequence seq);
  2926. Description
  2927. Parameters    Before
  2928. Call    After
  2929. Call
  2930. ref (C only)    x    /
  2931. seq    x    .
  2932. CancelRequest is used by the client of a connection-oriented transaction endpoint to cancel an outstanding outgoing request function (a call to SndRequest).   Calling this function tells the protocol that this transaction is no longer of interest, and allows it to free up any memory associated with this transaction  There is no acknowledgment from this function.  If the sequence number indicated is not a valid sequence number, then nothing will be done.
  2933. It is the responsibility of the client to destroy any data structures associated with the canceled request.
  2934. If the value of the seq parameter is set to zero, then ALL outstanding SndRequest functions will be canceled.
  2935. Be sure to call CancelReply if you are canceling an incoming request.  This is necessary because the OTSequence value of incoming requests are generated by the protocol, while the OTSequence value of outgoing requests are generated by the client, and they may overlap.
  2936. Valid States
  2937. T_DATAXFER
  2938. RESULT CODES
  2939. kENOSRErr
  2940. See Also
  2941. CancelReply
  2942. .c3..i.CancelReply;
  2943. FUNCTION
  2944. CancelReply    Cancel an outstanding RcvRequest.
  2945. C INTERFACE
  2946. OSStatus    OTCancelReply(EndpointRef ref, OTSequence seq);
  2947. C++ INTERFACE
  2948. OSStatus    TEndpoint::CancelReply(OTSequence seq);
  2949. Description
  2950. Parameters    Before
  2951. Call    After
  2952. Call
  2953. ref (C only)    x    /
  2954. seq    x    .
  2955. CancelReply is used by the client of a connection-oriented transaction endpoint to cancel an outstanding incoming request (received by RcvRequest).   Calling this function tells the protocol that this transaction is no longer of interest, and allows it to free up any memory associated with this transaction.  There is no acknowledgment from this function.  If the sequence number indicated is not a valid sequence number, then nothing will be done.
  2956. It is the responsibility of the client to destroy any data structures associated with the canceled request.
  2957. If the value of the seq parameter is set to zero, then ALL outstanding incoming requests will be canceled.
  2958. Be sure to call CancelRequest if you are canceling an outgoing request.  This is necessary because the OTSequence value of incoming requests are generated by the protocol, while the OTSequence value of outgoing requests are generated by the client, and they may overlap.
  2959.  
  2960. Valid States
  2961. T_DATAXFER
  2962. RESULT CODES
  2963. kENOSRErr
  2964. See Also
  2965. CancelRequest
  2966.  
  2967. .c1. Address Mapping
  2968. Another type of Open Transport provider described in this document is called a mapper.  A mapper is used to handle mapping names to protocol addresses. A client may create multiple mapper objects if desired.
  2969. With a mapper, a client can browse the network using the LookupName function to browse for all protocol addresses associated with a particular name or name pattern. A client can register a name on the network and make it visible to other network devices by using the RegisterName function. This registered name can be removed using the mapper’s RemoveName function. The ConfirmName function is used to efficiently verify that a particular name to protocol address mapping is valid.
  2970. Not all protocol families can support all of the functions available to the mapper, but most will support the LookupName and ConfirmName functions (described below).
  2971. Mappers support the same functionality supplied to all providers.
  2972. As with all Open Transport providers, there are functions to create the mapper, OpenMapper and AsyncOpenMapper, and a function to destroy the mapper, CloseProvider. A mapper can be used in either synchronous or asynchronous mode and uses a notification routine  to handle client callbacks for completion events. Unlike an endpoint, a mapper does not have any notification events that it sends to the client’s notification routine.  It has only completion events. 
  2973. There are no functions available to cancel outstanding asynchronous mapper functions.  The only way to cancel outstanding asynchronous mapper functions is to close the mapper (call OTCloseProvider with the MapperRef value).
  2974. .c3..i.OTOpenMapper;
  2975. FUNCTION
  2976. OpenMapper    Create a .i.mapper;.
  2977. C INTERFACE
  2978. MapperRef    OTOpenMapper(OTConfiguration* config, OTOpenFlags oflag, OSStatus* err)
  2979. C++ INTERFACE
  2980. None. (C++ clients should use the C interface to this function.)
  2981. Description
  2982. Parameters    Before
  2983. Call    After
  2984. Call
  2985. config    x    /
  2986. oflag    x    /
  2987. err    /    x
  2988. OTOpenMapper creates a mapper based on the supplied information, and returns a value by which the created mapper can be identified when calling other mapper functions.
  2989. The mapper will be opened in synchronous, non-blocking mode.
  2990. The config parameter is a pointer to an OTConfiguration structure. The client should not create one of these structures, but rather use the  function OTCreateConfiguration:
  2991.     pascal OTConfiguration* OTCreateConfiguration(char* path);
  2992. This function takes a string parameter which describes the desired provider layering (see the section on provider layering) and creates an OTConfiguration structure, returning a pointer to it to the client. The client should pass this pointer to OpenMapper. The OTOpenMapper function will destroy the structure. An example of calling OpenMapper using this function is shown below:
  2993. OSStatus err;
  2994. MapperRef ep = OTOpenMapper(OTCreateConfiguration(“nbp”), 0, &err);
  2995. The name string passed to the OTCreateConfiguration function is dependent upon which protocol family the client wishes to create a mapper for. The name string to be used to create a mapper for a particular protocol family will be given in the Open Transport documentation for that particular protocol family.
  2996. The parameter oflag is not currently used and should be set to zero.
  2997. The output parameter err points to a result code.
  2998. RESULT CODES
  2999. kENOENTErr
  3000. kENXIOErr
  3001. kENOMEMErr
  3002. See Also
  3003. AsyncOpenMapper, CloseProvider
  3004. .c3..i.OTAsyncOpenMapper;
  3005. FUNCTION
  3006. AsyncOpenMapper    Create a .i.mapper;.
  3007. C INTERFACE
  3008. OSStatus    OTAsyncOpenMapper(OTConfiguration* config, OTOpenFlags oflag, OTNotifyProcPtr proc, void* contextPtr)
  3009. C++ INTERFACE
  3010. None. (C++ clients should use the C interface to this function.)
  3011. Description
  3012. Parameters    Before
  3013. Call    After
  3014. Call
  3015. config    x    /
  3016. oflag    x    /
  3017. proc    x    /
  3018. contextPtr    x    /
  3019. OTAsyncOpenMapper  creates a mapper asynchronously, based on the supplied information.   If this function returns an error immediately, then the notification function will not be called.  If kOTNoError is returned, then the notification function will be called with the results of the open.
  3020. The config and oflag parameters have the same meaning as for OTOpenMapper.
  3021. When the open is complete, your notification function will be called with the code parameter set to T_OPENCOMPLETE.  The result parameter will either be kOTNoError if the open was successful, or will return a result code describing the error.  If the open was successful, the cookie is  the MapperRef for the mapper that was opened.
  3022. The mapper will be opened in asynchronous, non-blocking mode, and will already have a notification routine installed, which is the same notification routine used for the open.  If you want a different notifier installed, use RemoveNotifier to remove the current one, and use InstallNotifier to install a new one.
  3023.  
  3024. Warning: The OTAsyncOpenMapper function destroys the OTConfiguration returned by OTCreateConfiguration.  Never attempt to use the same configuration to open multiple mappers.  You can use the OTCloneConfiguration function to clone the configuration for this purpose.
  3025. RESULT CODES
  3026. kENOENTErr
  3027. kENXIOErr
  3028. kENOMEMErr
  3029. See Also
  3030. OTOpenMapper, OTCloseProvider
  3031. .c3..i.RegisterName;
  3032. FUNCTION
  3033. RegisterName    Register a name on the network.
  3034. C INTERFACE
  3035. OSStatus    OTRegisterName(MapperRef ref, TRegisterRequest* request, TRegisterReply* reply);
  3036. C++ INTERFACE
  3037. OSStatus    TMapper::RegisterName(TRegisterRequest* req, TRegisterReply* reply);
  3038. Description
  3039. Parameters    Before
  3040. Call    After
  3041. Call
  3042. ref (C only)    x    /
  3043. req->name.maxlen    /    /
  3044. req->name.len    x    /
  3045. req->name.buf    (x)    /
  3046. req->addr.maxlen    /    /
  3047. req->addr.len    x    /
  3048. req->addr.buf    (x)    /
  3049. req->flags    x    /
  3050. reply->addr.maxlen    x    /
  3051. reply->addr.len    /    x
  3052. reply->addr.buf    /    (x)
  3053. reply->nameid    /    x
  3054. RegisterName makes a name visible on the network to other network devices. Not all protocol families support dynamic name registration (such as TCP/IP), although this function may be still be implemented as a local function.
  3055. Note that most protocol implementations under Open Transport allow a client to specify a name in the call to the endpoint function Bind. This also causes the protocol to register a name on the network. This is a simpler technique and is preferable over having the client create and use a mapper object, especially where the name is associated with a server or service related to the created endpoint.
  3056. The req->name field is a TNetbuf that references the network name that is to be registered. The req->addr field is a  TNetbuf structure that references the protocol address with which the name should be associated. The req->addr parameter may have a length of 0, and the underlying protocol will perform some default action. The format of the names and protocol addresses are specific to the underlying protocol, and their formats are described in the Open Transport documentation for that particular protocol family.
  3057. The req->flags field is used to control registration, where appropriate.  Normally, this field is set to 0 for default registration behavior.  For some protocols (e.g. the Netware naming service), a value may be set in this field.  See the documentation for the naming service you are using to determine how to use this field.
  3058. If the mapper is in asynchronous mode, RegisterName returns immediately. Later, when the function completes execution, a T_REGNAMECOMPLETE event is issued. The cookie parameter to the notification routine  has a value equal to that of the name parameter passed to the RegisterName call.
  3059. If the reply parameter is non-NULL, when the registration completes, the reply->nameid field  will be set to a unique identifier for the registered name.  This identifier can later be used to delete the name.  This technique is more convenient than saving the name away somewhere so that it can be deleted later.  If the reply->addr.maxlen field is large enough, the address actually registered will be returned.  If this field is set to 0, then the address will not be filled in, and a kOTNoError result will be returned.  If this field is not set to 0, then a kOTBufferOverflowErr will be returned if it is not large enough.
  3060. If the name was already registered, a kOTAddressBusyErr error is returned, and no information will be returned in the reply parameter.
  3061.  
  3062. RESULT CODES
  3063. kOTBadNameErr
  3064. kOTAddrBusyErr
  3065. kOTNotSupportedErr
  3066. kOTBufferOverflowErr
  3067. See Also
  3068. LookupName, ConfirmName, DeleteName
  3069. .c3..i.DeleteName;
  3070. FUNCTION
  3071. DeleteName    Remove a previously registered name
  3072. C INTERFACE
  3073. OSStatus    OTDeleteName(MapperRef ref, TNetbuf* name);
  3074. C++ INTERFACE
  3075. OSStatus    TMapper::DeleteName(TNetbuf* name);
  3076. Description
  3077. Parameters    Before
  3078. Call    After
  3079. Call
  3080. ref (C only)    x    /
  3081. name->maxlen    /    /
  3082. name->addr.len    x    /
  3083. name->buf    ?    (?)
  3084. DeleteName removes a name that was previously register. Not all protocol families support dynamic name registration and deletion (such as TCP/IP), although this function may be still be implemented as a local function.
  3085. The name parameter is a pointer to a TNetbuf that references the network name that is to be removed.  The format of the names and protocol addresses are specific to the underlying protocol, and their formats are described in the Open Transport documentation for that particular protocol family.
  3086. If the mapper is in asynchronous mode, DeleteName returns immediately. Later, when the function completes execution, a T_DELNAMECOMPLETE event is issued. The cookie parameter to the notification routine has a value equal to that of the name parameter passed to the DeleteName call.
  3087. If the name was not found, a kOTNoAddressErr is returned.
  3088. RESULT CODES
  3089. kOTBadNameErr
  3090. kOTCanceledErr
  3091. kOTNoAddressErr
  3092. kOTNotSupportedErr
  3093. See Also
  3094. RegisterName
  3095. .c3..i.DeleteName;
  3096. FUNCTION
  3097. DeleteName    Remove a previously registered name
  3098. C INTERFACE
  3099. OSStatus    .i.OTDeleteNameByID;(MapperRef ref, OTNameID id);
  3100. C++ INTERFACE
  3101. OSStatus    TMapper::DeleteName(OTNameID id);
  3102. Description
  3103. Parameters    Before
  3104. Call    After
  3105. Call
  3106. ref (C only)    x    /
  3107. id    x    /
  3108. DeleteName removes a name that was previously register. Not all protocol families support dynamic name registration and deletion (such as TCP/IP), although this function may be still be implemented as a local function.
  3109. The id parameter is the OTNameID value that was returned when the name was registered. 
  3110. If the mapper is in asynchronous mode, DeleteName returns immediately. Later, when the function completes execution, a T_DELNAMECOMPLETE event is issued. The cookie parameter to the notification routine has a value equal to that of the id parameter passed to the DeleteName call.
  3111. If the name was not found, a kOTNoAddressErr is returned.
  3112. RESULT CODES
  3113. kOTBadNameErr
  3114. kOTCanceledErr
  3115. kOTNoAddressErr
  3116. kOTNotSupportedErr
  3117. See Also
  3118. RegisterName
  3119.  
  3120. .c3..i.LookupName;
  3121. FUNCTION
  3122. LookupName    Lookup a name or name pattern on the network
  3123. C INTERFACE
  3124. OSStatus    OTLookupName(MapperRef ref, TLookupRequest* req, TLookupReply* reply);
  3125. C++ INTERFACE
  3126. OSStatus    TMapper::LookupName(TLookupRequest* req, TLookupReply* reply);
  3127. Description
  3128. Parameters    Before
  3129. Call    After
  3130. Call
  3131. ref (C only)    x    /
  3132. req->name.maxlen    /    /
  3133. req->name.len    x    /
  3134. req->name.buf    (x)    /
  3135. req->addr.maxlen    /    /
  3136. req->addr.len    x    /
  3137. req->addr.buf    (x)    /
  3138. req->maxcnt    x    /
  3139. req->timeout    x    /
  3140. reply->names.maxlen    x    /
  3141. reply->names.len    /    x
  3142. reply->names.buf    (?)    (x)
  3143. reply->rspcount    /    x
  3144. LookupName is used to find all protocol addresses that correspond to a particular name or name pattern.
  3145. The req->maxcnt parameter gives the maximum number of names that should be returned.  If a client is expecting a specific number of replies for a particular name being looked up (usually one), then the client can get faster execution of the name lookup by specifying the expected number of replies.
  3146. The req->timeout parameter gives the approximate amount of time, in milliseconds that the lookup should attempt to find the requested number of names.  
  3147. The req parameter is a pointer to a structure that supplies the information for the lookup request.  The req->name TNetbuf supplies the network name that is to be looked up. Some protocol families support ‘wild-cards’ or pattern matching in this name.
  3148. The req->addr TNetbuf references the protocol address where the name(s) is(are) expected. This parameter is normally supplied with a length of 0, and the underlying protocol will search the default locations (where default depends upon the protocol family). However, if a client wants to look for a name(s) on a particular device, its protocol address can be specified.  This MAY provide less network traffic.
  3149. The client passes a pointer to TLookupReply structure in the reply parameter containing the following members:
  3150. struct TNetbuf names;
  3151. unsigned long rspcount;
  3152. The udata TNetbuf should be initialized referencing a buffer area large enough to hold all of the expected replies (although see the note below if using the mapper in asynchronous mode.) Upon completion of the function, the len field of the udata TNetbuf will hold the total length of all the names found, and the rspcount field will contain the number of names that were found. Because there may be multiple names of varying lengths returned, each name returned is in the following format:
  3153.  
  3154. unsigned short    addrLen;    /* length of address which follows        */
  3155. unsigned short    nameLen;    /* length of name which follows        */
  3156. unsigned char    addr[];    /* address */
  3157. unsigned char    name[];    /* name, with pad-byte to quad boundary    */
  3158. Additionally, each name is aligned in the buffer so that the total length of the name (including 4 bytes for the two length  fields) is a multiple of four bytes long. A client that is looking through the replies must account for this padding. For example,
  3159. len = ((short*)ptr)[0] + ((short*)ptr)[1];
  3160. ptr += (len + 3) & ~3;
  3161. The format of the names and protocol addresses are specific to the underlying protocol, and their formats are described in the Open Transport documentation for that particular protocol family.
  3162. If the mapper is in asynchronous mode, LookupName returns . Later, when the function completes execution, a T_LKUPNAMECOMPLETE event is issued. The cookie parameter to the notification routine has a value equal to that of the reply parameter passed to the LookupName call.
  3163. Note: In asynchronous mode, this function operates slightly different than other endpoint and mapper functions. In addition to the standard completion event, there is a T_LKUPNAMERESULT issued every time an additional name is added to the clients reply buffer. The client may choose to ignore this event, or the client may copy the reply from the reply buffer and set the reply->udata.len field or the reply->rspcount back to zero (but this may only be done inside the notification routine or results will be unpredictable). Using this feature, a client can avoid having to create a buffer large enough to hold all of the replies and reference it in the reply->udata TNetbuf.  When dispatching the last name, the client may receive both a T_LKUPNAMERESULT and a T_LKUPNAMECOMPLETE, or may just receive a T_LKUPNAMECOMPLETE.  If either the reply->udata.len or the reply->rspcount field is set back to zero, Open Transport will automatically set the other field to zero as well.
  3164.  
  3165. RESULT CODES
  3166. kOTBadNameErr
  3167. kOTNoDataErr
  3168. kOTBufferOverflowErr
  3169. kOTNotSupportedErr
  3170. See Also
  3171. DeleteName, ConfirmName
  3172.  
  3173. .c1. Utility functions
  3174. This section describes the utility functions available to clients of Open Transport.  Several of these functions have already been referenced, like OTCreateConfiguration.
  3175. .c3..i.InitOpenTransport;
  3176. FUNCTION
  3177. InitOpenTransport    Initialize the Open Transport library 
  3178. C INTERFACE
  3179. OSStatus    InitOpenTransport()
  3180. Description
  3181. InitOpenTransport must  be called before your application or code resource can make Open Transport calls (see the Getting Started section for details).  Make sure that you link with the appropriate library for your usage - applications must link with a different Open Transport library than code resource.   (In case you're wondering, this is so that Open Transport can determine where to get memory on your behalf, and how to watch for your death).
  3182. This function returns an error code if Open Transport could not be initialized.
  3183.  
  3184. See Also
  3185. CloseOpenTransport
  3186.  
  3187. .c3..i.CloseOpenTransport;
  3188. FUNCTION
  3189. CloseOpenTransport    Inform Open Transport that it will no longer be used. 
  3190. C INTERFACE
  3191. void    CloseOpenTransport()
  3192. Description
  3193. CloseOpenTransport is called when the application or code resource will no longer use Open Transport functions.   It is not necessary for applications to make this call, but it is required that stand-alone code resources do before they unload from memory.
  3194. An application can call CloseOpenTransport at any time.  This potentially allows Open Transport to unload from memory until it is needed again.  A subsequent call to InitOpenTransport will reload Open Transport.
  3195. See Also
  3196. InitOpenTransport
  3197.  
  3198. .c3..i.OTCreateConfiguration;
  3199. FUNCTION
  3200. OTCreateConfiguration    Create an .i.OTConfiguration; structure for opening a provider
  3201. C INTERFACE
  3202. OTConfiguration*    OTCreateConfiguration(const char* path)
  3203. Description
  3204. Parameters    Before
  3205. Call    After
  3206. Call
  3207. path    x    /
  3208. OTCreateConfiguration takes a string which describes the provider desired (see the section on Specifying Provider layering) and returns a pointer to an OTConfiguration structure that can be used to open a provider.
  3209. Because this function is often called inline with the open call , it does not return an error.  Instead, it returns a NULL if there is not enough memory to create the OTConfiguration structure, and it returns an ((OTConfiguration*)-1L) if the path that was passed to it was not parseable.  The open routines check for these values, and return the appropriate error code.
  3210. See Also
  3211. OTCloneConfiguration, OTDestroyConfiguration
  3212. .c3..i.OTCloneConfiguration;
  3213. FUNCTION
  3214. OTCloneConfiguration    Create a copy of an .i.OTConfiguration; structure 
  3215. C INTERFACE
  3216. OTConfiguration*    OTCloneConfiguration(OTConfiguration* cfig)
  3217. Description
  3218. Parameters    Before
  3219. Call    After
  3220. Call
  3221. cfig    x    /
  3222. OTCloneConfiguration returns a copy of the OTConfiguration passed in as a parameter.  If the OTConfiguration*  supplied is NULL or -1L, the same value will be returned. 
  3223. See Also
  3224. OTCreateConfiguration, OTDestroyConfiguration
  3225. .c3..i.OTDestroyConfiguration;
  3226. FUNCTION
  3227. OTDestroyConfiguration    Destroy an .i.OTConfiguration; structure 
  3228. C INTERFACE
  3229. void    OTDestroyConfiguration(OTConfiguration* cfig)
  3230. Description
  3231. Parameters    Before
  3232. Call    After
  3233. Call
  3234. cfig    x    /
  3235. OTDestroyConfiguration destroys the OTConfiguration passed in as a parameter and release all memory it has allocated.
  3236. It is rarely necessary to use this function because using an OTConfiguration to open a provider destroys the OTConfiguration.  However, there may be cases where an OTConfiguration is created and never used.  In this case, OTDestroyConfiguration should be called to free up the memory associated with the OTConfiguration.
  3237. See Also
  3238. OTCloneConfiguration, OTCreateConfiguration
  3239. .c3..i.OTCreateOptions;
  3240. FUNCTION
  3241. OTCreateOptions    Create a TNetbuf for OptionManagement calls from a string specifying the options and values.
  3242. C INTERFACE
  3243. OSStatus    OTCreateOptions(const char* endptName, char** strPtr, TNetbuf* buf)
  3244. Description
  3245. Parameters    Before
  3246. Call    After
  3247. Call
  3248. endptName    x    x
  3249. strPtr    (x)    (?)
  3250. buf->len    x    x
  3251. buf->maxlen    x    x
  3252. buf->buf    x    (x)
  3253. OTCreateOptions creates a TNetbuf suitable for use by calls that specify options. 
  3254.   The endptName parameter specifies the name of the endpoint for which the options are destined. 
  3255. The strPtr parameter points to a pointer containing the option string information.  If an error occurs, strPtr will be updated to point to the position in the string where the error occurred.
  3256. The buf parameter must point to a TNetbuf which has enough room to hold the requested options.  Typically, the buf->len value is set to zero.  If it is not, the option information will be appended to the TNetbuf beginning at the offset specified by buf->len.  The buf->len value will be updated to reflect the new length when the function returns.
  3257. Not all endpoints support this functionality.  If not, a kOTNotSupportedErr will be returned.
  3258. char* str = "BaudRate = 9650 DataBits = 8 Parity = 0 StopBits = 10";
  3259. UInt8 buffer[512];
  3260. TOptMgmt cmd;
  3261. cmd.opt.len = 0;
  3262. cmd.opt.maxlen = sizeof(buffer);
  3263. cmd.opt.buf = buffer;
  3264. cmd.flags = T_NEGOTIATE;
  3265. err = OTCreateOptions("serialA", &str, &cmd.opt)
  3266. The names for options are described in the documents for the specific providers.  Value for options come in 3 basic flavors: numeric, string, and byte arrays.
  3267. The format for numeric options is:
  3268.     an optional '-' for negative numbers
  3269.     a leading '$' or "0x" for hexadecimal numbers,
  3270.     followed by the digits comprising the number
  3271. The format for string options is:
  3272.     a delimiter character - the first non-blank character after the "=" is the delimiter.
  3273.     the characters comprising the string
  3274.     the delimiter character repeated.
  3275. The format for byte array options is:
  3276.     a leading "$" or "0x"
  3277. a sequence of hex digits with no intervening spaces or tabs.  There must be an even number of digits.
  3278. Result codes
  3279. kOTNotSupportedErr
  3280. kOTBufferOverflowErr
  3281. kOTBadOptionErr
  3282. See Also
  3283. OTCreateOptionString,OptionManagement
  3284. .c3..i.OTCreateOptionString;
  3285. FUNCTION
  3286. OTCreateOptionString    Create a string from a TOption structure. 
  3287. C INTERFACE
  3288. OSStatus    OTCreateOptionString(const char* endptName, TOption** optPtr, void* bufEnd, char* string, size_t stringSize)
  3289. Description
  3290. Parameters    Before
  3291. Call    After
  3292. Call
  3293. endptName    x    /
  3294. optPtr    (x)    (x)
  3295. bufEnd    x    /
  3296. string    x    (x)
  3297. stringSize    x    /
  3298. OTCreateOptionString attempts to return a string corresponding to the option or options stored at *optPtr. 
  3299. The endptName parameter specifies the name of the endpoint that the options are for.
  3300. The bufEnd parameter is a pointer to the byte of memory past the last option.
  3301. The string and stringSize parameters describe the character buffer where the string will be stored. 
  3302. TOptMgmt    cmd;
  3303. UInt8    buffer[512];
  3304. char    string[256];
  3305. //
  3306. // Read the current settings
  3307. //
  3308. cmd.opt.len = sizeof(TOption);
  3309. cmd.opt.maxlen = sizeof(buffer);
  3310. cmd.opt.buf = buffer;
  3311. ((TOption*)buffer)->len = sizeof(TOption);
  3312. ((TOption*)buffer)->level = COM_SERIAL;
  3313. ((TOption*)buffer)->name = T_ALLOPT;
  3314. ((TOption*)buffer)->status = 0;
  3315. cmd.flags = T_CURRENT;
  3316. OptionManagement(theEndpt, &cmd, &cmd);
  3317. //
  3318. // Convert the returned options back into a string
  3319. //
  3320. TOption* opts = (TOption*)cmd.opt.buf;
  3321. err = OTCreateOptionString("serialA", &opts, cmd.opt.buf + cmd.opt.len,
  3322.                   string, sizeof(string));
  3323. printf("Options = \"%s\"", string);
  3324.  
  3325.  
  3326. Result codes
  3327. kOTNotSupportedErr
  3328. kOTBufferOverflowErr
  3329. kOTBadOptionErr
  3330. See Also
  3331. OTCreateConfiguration, OTDestroyConfiguration
  3332.  
  3333. .c3..i.OTEnterInterrupt;
  3334. FUNCTION
  3335. OTEnterInterrupt    Inform Open Transport that the caller is inside an interrupt routine 
  3336. C INTERFACE
  3337. void    OTEnterInterrupt()
  3338. Description
  3339. OTEnterInterrupt informs Open Transport that it is at primary interrupt time.  This allows Open Transport to more intelligently schedule network activity.  A client must make this call whenever it is going to call Open Transport routines from primary interrupt time (e.g. from a VBL or Time Manager task, etc.)
  3340. OTLeaveInterrupt must be called before the client returns from the interrupt routine.
  3341. NOTE: On 68K Macintoshes, your A5 world must be set correctly before making this call (i.e. the same value it had when InitOpenTransport was called).
  3342. {
  3343.     OTEnterInterrupt();
  3344.     DoMyThing(myParms)
  3345.     OTLeaveInterrupt();
  3346. }
  3347. See Also
  3348. OTLeaveInterrupt
  3349.  
  3350. .c3..i.OTLeaveInterrupt;
  3351. FUNCTION
  3352. OTLeaveInterrupt    Inform Open Transport that the caller is leaving an interrupt routine 
  3353. C INTERFACE
  3354. void    OTLeaveInterrupt()
  3355. Description
  3356. OTLeaveInterrupt informs Open Transport that the caller will no longer be using Open Transport from within an interrupt routine (see OTEnterInterrupt on the previous page).   A client should never make the OTEnterInterrupt call without the matching OTLeaveInterrupt call.
  3357. NOTE: On 68K Macintoshes, your A5 world must be set correctly before making this call (i.e. the same value it had when InitOpenTransport was called).
  3358. See Also
  3359. OTEnterInterrupt
  3360. .c3..i.OTIdle;
  3361. FUNCTION
  3362. OTIdle    A routine to call when there is nothing else to do 
  3363. C INTERFACE
  3364. void    OTIdle()
  3365. Description
  3366. OTIdle is a function that a client can call while it is waiting for asynchronous provider operations to complete.  It is not necessary for the correct operation of Open Transport to call this function.
  3367. OTIdle may  not be called at primary interrupt time.  OTIdle will  NOT call SystemTask , WaitNextEvent, or GetNextEvent.
  3368. See Also
  3369. OTDelay
  3370. .c3..i.OTDelay;
  3371. FUNCTION
  3372. OTDelay    Delay for a specified number of seconds 
  3373. C INTERFACE
  3374. void    OTDelay(UInt32 seconds)
  3375. Description
  3376. Parameters    Before
  3377. Call    After
  3378. Call
  3379. seconds    x    /
  3380. OTDelay will delay for the number of seconds specified in the seconds parameter.  While the delay is occurring, it will continuously call OTIdle. 
  3381. OTDelay should only be called from within an application at SystemTask time, and there is no known reason for calling it.  It is provided for compatibility with the UNIX sleep function (sleep is #defined to be the OTDelay function). 
  3382. See Also
  3383. OTIdle
  3384.  
  3385.  
  3386.  
  3387.  
  3388. .c3..i.OTGetIndexedPort;
  3389. FUNCTION
  3390. OTGetIndexedPort    Return information on the n'th hardware port available to Open Transport 
  3391. C INTERFACE
  3392. Boolean    OTGetIndexedPort(OTPortRecord* record, size_t index)
  3393. Description
  3394. Parameters    Before
  3395. Call    After
  3396. Call
  3397. record    x    (x)
  3398. index    x    /
  3399. OTGetIndexedPort is used to iterate through the hardware ports available to Open Transport.  Repeated calls to OTGetIndexedPort with incrementing index numbers (starting with 0) will return information on each of the available hardware ports in turn.  The function will return false if the index value is outside the range of available ports.
  3400. The record parameter will be filled in with the port information if OTGetIndexedPort returns true.  
  3401. See the section on ports for information on the .i.OTPortRecord ;structure.
  3402. See Also
  3403.  
  3404.  
  3405. .c3..i.OTFindPort;
  3406. FUNCTION
  3407. OTFindPort    Find information about a port given the name of the port 
  3408. C INTERFACE
  3409. Boolean    OTFindPort(OTPortRecord* record, const char* portName)
  3410. Description
  3411. Parameters    Before
  3412. Call    After
  3413. Call
  3414. record    x    (x)
  3415. portName    (x)    /
  3416. OTFindPort returns information into the record parameter about the port named in portName.
  3417. This function returns false if a port with the specified name does not exist.
  3418. if ( OTFindPort(recordBuf, "serialA") )
  3419. {
  3420.     // Do something with record information
  3421. }
  3422. See Also
  3423. OTFindPortByRef
  3424. .c3..i.OTFindPortByRef;
  3425. FUNCTION
  3426. OTFindPortByRef    Find information about a port given the OTPortRef value.
  3427. C INTERFACE
  3428. Boolean    OTFindPortByRef(OTPortRecord* record, OTPortRef ref)
  3429. Description
  3430. Parameters    Before
  3431. Call    After
  3432. Call
  3433. record    x    (x)
  3434. ref    x    /
  3435. OTFindPortByRef returns information into the record parameter about the port  OTPortRef is ref.
  3436. The function returns false if a port matching the specifications does not exist.
  3437. OTPortRef ref = OTCreatePortRef(kOTMotherboardBus, kOTSerialDevice, 0, 10);
  3438. if ( OTFindPortByRef(recordBuf, ref,) )
  3439. {
  3440.     // Do something with record information
  3441. }
  3442. See the section on Ports for more information about OTPortRefs and device names.
  3443. See Also
  3444. OTFindPort
  3445.  
  3446. .c3..i.OTCreatePortRef;
  3447. FUNCTION
  3448. OTCreatePortRef    Create an OTPortRef, given knowledge about the port. 
  3449. C INTERFACE
  3450. OTPortRef    OTCreatePortRef(UInt8 busType, UInt16 devType, UInt16 slot, UInt16 other)
  3451. Description
  3452. Parameters    Before
  3453. Call    After
  3454. Call
  3455. busType    x    /
  3456. devType    x    /
  3457. slot    x    /
  3458. other    x    /
  3459. OTCreatePortRef creates an OTPortRef that can be used for the various port-finding utilities of Open Transport.  An OTPortRef contains the 4 pieces of information stored in an opaque 32-bit format.  Manipulation of OTPortRef values should only be done with the utility functions provided by Open Transport.
  3460. Currently defined bus types are:
  3461.     enum
  3462.     {
  3463.         kOTUnknownBusPort    = 0,
  3464.         kOTMotherboardBus    = 1,
  3465.         kOTNuBus        = 2,
  3466.         kOTPCIBus        = 3,
  3467.         kOTGeoPort        = 4,
  3468.         kOTPCMCIABus    = 5
  3469.     };
  3470. These definitions can be found in the OpenTransport.h header file.
  3471. Currently defined device types are:
  3472. enum
  3473. {
  3474.     kOTADEVDevice        = 1,        /* An Atalk ADEV        */
  3475.     kOTMDEVDevice        = 2,        /* A TCP/IP MDEV        */
  3476.     kOTLocalTalkDevice    = 3,        /* LocalTalk            */
  3477.     kOTIRTalkDevice    = 4,        /* IRTalk            */
  3478.     kOTTokenRingDevice    = 5,        /* Token Ring            */
  3479.     kOTISDNDevice        = 6,        /* ISDN            */
  3480.     kOTATMDevice        = 7,        /* ATM                */
  3481.     kOTSMDSDevice        = 8,        /* SMDS            */
  3482.     kOTSerialDevice    = 9,        /* Serial             */
  3483.     kOTEthernetDevice    = 10,        /* Ethernet            */
  3484.     kOTSLIPDevice        = 11,        /* SLIP Pseudo-device    */
  3485.     kOTPPPDevice        = 12,        /* PPP Pseudo-device        */
  3486.     kOTModemDevice    = 13,        /* Modem Pseudo-Device    */
  3487.     kOTFastEthernetDevice = 14,        /* 100 MB Ethernet        */
  3488.     kOTFDDIDevice        = 15,        /* FDDI            */
  3489.     kOTATMLANEDevice    = 16,        /* ATM LAN emulation        */
  3490.     kOTATMSNAPDevice    = 17        /* ATM SNAP emulation    */
  3491. };
  3492. These definitions can be found in the OpenTptLinks.h header file.
  3493. The slot parameter typically defines the slot location of the device, while the other parameter typically disambiguates between multiple hardware ports within that slot, if necessary.
  3494. See Also
  3495. OTGetDeviceTypeFromPortRef, OTGetBusTypeFromPortRef, OTGetSlotFromPortRef
  3496. .c3..i.OTGetDeviceTypeFromPortRef;
  3497. FUNCTION
  3498. OTGetDeviceTypeFromPortRef    Extracts the device type from an OTPortRef. 
  3499. C INTERFACE
  3500. UInt16    OTGetDeviceTypeFromPortRef(OTPortRef ref)
  3501. Description
  3502. Parameters    Before
  3503. Call    After
  3504. Call
  3505. ref    x    /
  3506. This function extracts the device type information from the OTPortRef and returns the value.
  3507. See Also
  3508. OTGetBusTypeFromPortRef, OTGetSlotFromPortRef, OTCreatePortRef
  3509. .c3..i.OTGetBusTypeFromPortRef;
  3510. FUNCTION
  3511. OTGetBusTypeFromPortRef    Extracts the bus type from an OTPortRef. 
  3512. C INTERFACE
  3513. UInt16    OTGetBusTypeFromPortRef(OTPortRef ref)
  3514. Description
  3515. Parameters    Before
  3516. Call    After
  3517. Call
  3518. ref    x    /
  3519. This function extracts the bus type information from the OTPortRef and returns the value.
  3520. See Also
  3521. OTGetDeviceTypeFromPortRef, OTGetSlotFromPortRef, OTCreatePortRef
  3522. .c3..i.OTGetSlotFromPortRef;
  3523. FUNCTION
  3524. OTGetSlotFromPortRef    Extracts the slot information from an OTPortRef. 
  3525. C INTERFACE
  3526. UInt16    OTGetDeviceTypeFromPortRef(OTPortRef ref, UInt16* otherPtr)
  3527. Description
  3528. Parameters    Before
  3529. Call    After
  3530. Call
  3531. ref    x    /
  3532. otherPtr    x    (x)
  3533. This function extracts the slot information from the OTPortRef.  It returns the value of the slot number stored in the OTPortRef, and if otherPtr is not NULL, it store the "other" information at the value pointed to by otherPtr.
  3534. See Also
  3535. OTGetBusTypeFromPortRef, OTGetDeviceTypeFromPortRef, OTCreatePortRef
  3536.  
  3537. .c3..i.OTCreateSystemTask;
  3538. FUNCTION
  3539. OTCreateSystemTask    Create a reference that will allow a function to be run at the next SystemTask. 
  3540. C INTERFACE
  3541. long    OTCreateSystemTask(OTProcessProcPtr proc, void* contextInfo)
  3542. Description
  3543. Parameters    Before
  3544. Call    After
  3545. Call
  3546. proc    x    /
  3547. contextInfo    x    /
  3548. OTCreateSystemTask creates a reference that can be used to schedule the function pointed to by proc to be called at the next SystemTask.  When scheduled (see OTScheduleSystemTask), the function will be called back at the next SystemTask and will be passed the contextInfo as a parameter.  For 68K clients only, at the time of the callback, the A5 global world will be set to the A5 global world at the time that OTCreateSystemTask was called.  The typedef for the OTProcessProcPtr function is:
  3549. typedef pascal void (*OTProcessProcPtr)(void* contextInfo); 
  3550. The return value of the function is a reference that should be used when calling OTScheduleSystemTask or OTDestroySystemTask.  If the return value is zero, then there is not enough memory to allocate the necessary data.
  3551. See Also
  3552. OTDestroySystemTask, OTScheduleSystemTask, OTCancelSystemTask
  3553.  
  3554. .c3..i.OTDestroySystemTask;
  3555. FUNCTION
  3556. OTDestroySystemTask    Destroy a SystemTask object created with the OTCreateSystemTask function
  3557. C INTERFACE
  3558. void    OTDestroySystemTask(long stCookie)
  3559. Description
  3560. Parameters    Before
  3561. Call    After
  3562. Call
  3563. stCookie    x    /
  3564. OTDestroySystemTask makes a reference returned by OTCreateSystemTask invalid, and frees any resources associated with the OTCreateSystemTask call.   This call should be made when it is no longer necessary to schedule the function.  It can be made at any time.
  3565. See Also
  3566. OTCreateSystemTask, OTScheduleSystemTask, OTCancelSystemTask
  3567.  
  3568. .c3..i.OTScheduleSystemTask;
  3569. FUNCTION
  3570. OTScheduleSystemTask    Schedule a function to be called at SystemTask time 
  3571. C INTERFACE
  3572. Boolean    OTScheduleSystemTask(long stCookie)
  3573. Description
  3574. Parameters    Before
  3575. Call    After
  3576. Call
  3577. stCookie    x    /
  3578. OTScheduleSystemTask will schedule the function associated with the stCookie parameter (this value was returned by OTCreateSystemTask) for running at the next SystemTask time.  This call can be made at any time.  This function returns true if the function was schedule, false if not.  If the function was not schedule, and the stCookie parameter is valid, then this indicates that the function is already scheduled to run.
  3579. See Also
  3580. OTCreateSystemTask, OTDestroySystemTask, OTCancelSystemTask
  3581. .c3..i.OTCancelSystemTask;
  3582. FUNCTION
  3583. OTCancelSystemTask    Cancel a function that is scheduled to be called at SystemTask time 
  3584. C INTERFACE
  3585. Boolean    OTCancelSystemTask(long stCookie)
  3586. Description
  3587. Parameters    Before
  3588. Call    After
  3589. Call
  3590. stCookie    x    /
  3591. OTCancelSystemTask will cancel  a function that was scheduled to run at System Task time by calling OTScheduleSystemTask.  The function returns true if the scheduling was able to be canceled.  If the function returns false, then either the function was not scheduled or it is too late to cancel.
  3592. See Also
  3593. OTCreateSystemTask, OTDestroySystemTask, OTScheduleSystemTask
  3594. .c3..i.OTCanMakeSyncCall;
  3595. FUNCTION
  3596. OTCanMakeSyncCall    Determine whether synchronous calls to Open Transport are allowed 
  3597. C INTERFACE
  3598. Boolean    OTCanMakeSyncCall()
  3599. Description
  3600. OTCanMakeSyncCall will return true if you can make a synchronous call to Open Transport.  A false will be returned if a synchronous call will fail.  This call will not function properly if you make the call from inside of an interrupt routine, and you haven't called OTEnterInterrupt.
  3601. See Also
  3602. OTCreateSystemTask, OTDestroySystemTask, OTScheduleSystemTask
  3603.  
  3604.  
  3605. .c3..i.OTCreateDeferredTask;
  3606. FUNCTION
  3607. OTCreateDeferredTask    Create a reference that will allow a function to be run at the next Deferred task time. 
  3608. C INTERFACE
  3609. long    OTCreateDeferredTask(OTProcessProcPtr proc, void* contextInfo)
  3610. Description
  3611. Parameters    Before
  3612. Call    After
  3613. Call
  3614. proc    x    /
  3615. contextInfo    x    /
  3616. OTCreateDeferredTask creates a reference that can be used to schedule the function pointed to by proc to be called at the next Deferred Task time  When scheduled (see OTScheduleDeferredTask), the function will be called back at the appropriate time and will be passed the contextInfo as a parameter.  For 68K only, at the time of the callback, the A5 global world will be set to the A5 global world at the time that OTCreateDeferredTask was called.  The typedef for the OTProcessProcPtr function is:
  3617. typedef void (*OTProcessProcPtr)(void* contextInfo); 
  3618. The return value of the function is a reference that should be used when calling OTScheduleDeferredTask or OTDestroyDeferredTask.  If the return value is zero, then there is not enough memory to allocate the necessary data.
  3619. See Also
  3620. OTDestroyDeferredTask, OTScheduleSystemTask
  3621.  
  3622. .c3..i.OTDestroyDeferredTask;
  3623. FUNCTION
  3624. OTDestroyDeferredTask    Destroy a deferred task object created with the OTCreateDeferredTask function
  3625. C INTERFACE
  3626. void    OTDestroyDeferredTask(long dtCookie)
  3627. Description
  3628. Parameters    Before
  3629. Call    After
  3630. Call
  3631. dtCookie    x    /
  3632. OTDestroyDeferredTask makes a reference returned by OTCreateDeferredTask invalid, and frees any resources associated with the OTCreateDeferredTask call.   This call should be made when it is no longer necessary to schedule the function.  It can be made at any time.
  3633. See Also
  3634. OTCreateDeferredTask, OTScheduleDeferredTask
  3635.  
  3636. .c3..i.OTScheduleDeferredTask;
  3637. FUNCTION
  3638. OTScheduleDeferredTask    Schedule a function to be called at deferred task time 
  3639. C INTERFACE
  3640. Boolean    OTScheduleDeferredTask(long dtCookie)
  3641. Description
  3642. Parameters    Before
  3643. Call    After
  3644. Call
  3645. dtCookie    x    /
  3646. OTScheduleDeferredTask will schedule the function associated with the dtCookie parameter (this value was returned by OTCreateDeferredTask) for running at the next Deferred Task time.  This call can be made at any time.  This function returns true if the function was schedule, false if not.  If the function was not schedule, and the dtCookie parameter is valid, then this indicates that the function is already scheduled to run.
  3647. This function is intended to be used by interrupt service routines to schedule deferred task processing independently of the underlying deferred task mechanism.
  3648. See Also
  3649. OTCreateDeferredTask, OTDestroyDeferredTask
  3650.  
  3651.  
  3652.  
  3653. .c1.Native functions
  3654. This section describes some Open Transport functions that are only available to native clients.  They have no mixed-mode glue associated with them, so your application or extension must be built FAT in order to use these APIs on a Power Macintosh machine.
  3655. .c3..i.OTYieldPortRequest;
  3656. FUNCTION
  3657. OTYieldPortRequest    Ask all users of a port to yield the port 
  3658. C INTERFACE
  3659. OSStatus    OTYieldPortRequest(ProviderRef provider, OTPortRef ref, OTClientList* buffer, size_t bufferSize)
  3660. Description
  3661. Parameters    Before
  3662. Call    After
  3663. Call
  3664. provider    x    /
  3665. ref    x    /
  3666. buffer    (?)    (x)
  3667. bufferSize    x    /
  3668. OTYieldPortRequest is used to request the use of a port (normally, a serial port or modem) from whoever is currently using the port.   If the function returns an error, then something went wrong and the request could not be completed.  This could be because of lack of resources, or the port specified does not support the request.  If kEBUSYErr is returned, the buffer parameter will contain a list of all of the clients that rejected the request.    The bufferSize parameter is the size of the buffer parameter (including the fNumClients field).  The buffer is a list of concatenated pascal strings enumerating the name of each client that rejected the request (normally only one).
  3669. struct OTClientList
  3670. {
  3671.     size_t fNumClients;
  3672.     UInt8    fBuffer[4];
  3673. };
  3674. In the case where you want to be extremely rude and grab the port anyway, pass NULL for the buffer pointer.  In this case, if the function returns kOTNoError, then the port has been yielded, and you can grab it.  Note that normally a port will only yield in this manner if it's current client is passively listening - the port will not be grabbed if a connection is in progress.
  3675. The supplied ProviderRef must be a provider (normally an endpoint) that is open on the requested port.  You may not use this provider while the OTYieldPortRequest call is in progress.
  3676. This call may only be made at System Task time (OTCanMakeSyncCall returns true).
  3677. Once the yield port request returns kOTNoError (or kENOENTErr - see below), you may attempt to use the port (normally, this is by binding with a qlen <> 0 ,or by connecting.  If you need to cancel the yield request, call OTYieldPortRequest with a buffer of (void*)-1L.  If you do not do one of these three things, the port will automatically unyield in about 10 seconds.
  3678. ERRORS
  3679. kOTBadSyncErr    Called at non-system-task time
  3680. kOTBadReferenceErr    Either the provider does not use the requested OTPortRef, or the requested OTPortRef does not exist.
  3681. kOTNotSupportedErr    The requested port does not support yielding.
  3682. kENOMEMErr    Not enough memory to complete the request
  3683. kEBUSYErr    A client "nak"d the request to yield
  3684. kENXIOErr    The underlying provider will not yield, probably because the current client is already connected.
  3685. kENOENTErr    The underlying provider does not currently have a client, so doing an OTYieldPortRequest was unnecessary.
  3686.  
  3687.  
  3688.  
  3689. .c1.Client callbacks
  3690. Open Transport provides several ways for clients to get notification when significant events occur in the Open Transport system.  The first is through the notifiers that are installed on providers.  Several events may be passed to your notifier that are not "standard" events.  These are:
  3691. kOTProviderIsDisconnected    
  3692.     Your provider was a listener (bound with qlen <> 0), and it has been disconnected (is no longer listening).  This currently only happens with serial ports, but could also happen with other connection-oriented drivers that have characteristics similar to serial ports.  You will get a kOTProviderIsReconnected message when the cause of the disconnection is relieved (see the section on the OTYieldPortRequest function).
  3693. kOTProviderIsReconnected
  3694.     Your provider has been reconnected.  Your provider is once again listening.
  3695. kOTProviderWillClose
  3696.     Your provider will be closed as soon as you return from the notifier.  This callback is always done at System Task time (OTCanMakeSyncCall will return true).  You may set your provider into synchronous mode and make a few last calls to prepare for being closed.  Once you return from the notifier, any calls made using the provider except OTCloseProvider will fail with a kOTOutStateErr. 
  3697. kOTProviderIsClosed
  3698.     Your provider has been closed.  The reason for being closed can be found in the OTResult value passed to your notifier.  The reasons typically are kOTPortHasDiedErr, kOTPortWasEjectedErr, or kOTPortLostConnectionErr.  Any calls other than OTCloseProvider will fail with a kOTOutStateErr.  
  3699. The second type of callback that Open Transport supplies is general client notification.  In order to receive these notifications, you must call the OTRegisterAsClient function:
  3700. OSStatus OTRegisterAsClient(OTClientName name, OTNotifyProcPtr proc)
  3701. This function supplies Open Transport with your name ("name" is currently a char* parameter - a zero-terminated "C" string.  It should be read from a resource in order to allow the name to be internationalized).  The proc parameter is a pointer to a notification procedure that will be called whenever significant events occur in the Open Transport system.
  3702. When you no longer want to receive notification, you can call OTUnregisterAsClient:
  3703. OSStatus OTUnregisterAsClient()
  3704. Calling this function is optional, since either calling CloseOpenTransport or just exiting your application will automatically unregister you as a client.
  3705. The events you may currently receive are:
  3706. kOTPortDisabled
  3707.     A port has gone offline.  The OTResult parameter will give the specific reason, if known, and the cookie parameter is the OTPortRef of the port that went offline.  A port going offline also often results in providers getting kOTProviderIsClosed events.  There is no guarantee in Open Transport as to which of these events will be received first.
  3708. kOTPortEnabled
  3709.     A port which had previously been disabled is now enabled.  The cookie parameter is the OTPortRef of the port that is now enabled.
  3710. kOTNewPortRegistered
  3711.     A new port has been registered with Open transport.  The cookie parameter is the OTPortRef of the new port.
  3712. kOTClosePortRequest
  3713.     You currently are using a provider that is using a port that some other application wants to use.  The OTResult parameter is the reason for the request (normally kOTNoError or kOTUserRequestedErr), and the cookie parameter is a pointer to an OTPortCloseStruct:
  3714.     struct OTPortCloseStruct
  3715.     {
  3716.         OTPortRef    fPortRef;
  3717.         ProviderRef    fTheProvider;
  3718.         OSStatus    fDenyReason;
  3719.         OTClientName    fRequestor;
  3720.     };
  3721.  
  3722.     The fPortRef field describes the port that is asking to be closed.  The fTheProvider field tells you the provider that is currently using the port. The fRequestor field is the name of the requesting application or system service.  If you will yield the port, you need do nothing.  If you won't yield the port, you must fill in the fDenyReason field with a non-zero value that may specify the reason (normally, kOTUserRequestedErr is used).  This callback is always done at SystemTask time, so you may put up a dialog to the user or take other action as appropriate.  Currently, this callback is only used for serial ports, but it is applicable to any hardware device which cannot shared the port with multiple clients.  If you are willing to yield the port, and you are currently actively connected (as opposed to listening in the T_IDLE state with a qlen <> 0), you must issue a synchronous OTSndDisconnect in order to yield the port.
  3723.     Your provider will receive a kOTPortIsDisconnected event if the port is grabbed away from you.  When the "grabber" is done, it will receive a kOTPortIsReconnected event.  
  3724.  
  3725. .c1.Advanced Topics
  3726. This section describes some topics for the more advanced clients of Open Transport.  
  3727. .c2.No-Copy Receives
  3728. Open Transport provides support for receives without copying the data. When using this feature of Open Transport, you should be aware that using no-copy receives can adversely affect the performance of the Open Transport system if it is not done correctly. 
  3729. The .i.OTBuffer ;data structure is the structure returned by no-copy receives.  If you are familiar with STREAMS mblk_t data structures, you can see that this structure is just a slight modification of the mblk_t structure.
  3730.  
  3731. struct OTBuffer
  3732. {
  3733.     void*        fLink;        // b_next & b_prev
  3734.     void*        fLink2;
  3735.     OTBuffer*    fNext;        // b_cont
  3736.     UInt8*        fData;        // b_rptr
  3737.     size_t        fLen;        // b_wptr
  3738.     void*        fSave;        // b_datap
  3739.     UInt8        fBand;        // b_band
  3740.     UInt8        fType;        // b_pad1
  3741.     UInt8        fPad1;
  3742.     UInt8        fFlags;    // b_flag
  3743. };
  3744.  
  3745.  
  3746. fLink    A link field, unused
  3747. fLink2    Another link field, unused
  3748. fNext    A pointer to the next OTBuffer in the chain
  3749. fData    A pointer to the data belonging to this OTBuffer
  3750. fLen    The length of data pointed to by fData
  3751. fSave    A reserved field
  3752. fBand    A byte corresponding to the "band" of the data.
  3753. fType    A byte describing the "type" of the data (normally M_DATA, M_PROTO, or M_PCPROTO)
  3754. fPad1    An unused byte
  3755. fFlags    The flags associated with the data (MSGMARK, MSGDELIM)
  3756. By tracing the chain of fNext pointers, all of the data associated with the message can be accessed.  Under NO CIRCUMSTANCES WRITE TO THIS DATA STRUCTURE.  It is read-only.  If you write to it, it is quite possible that you will crash the system.  Under Copland, if you write to it, you will get an access fault which will kill your application.
  3757. Because this structure is read-only, Open Transport provides a few utilities to allow data to be read from this structure.
  3758.  
  3759.     struct .i.OTBufferInfo
  3760.     {
  3761.         OTBuffer*    fBuffer;
  3762.         size_t        fOffset;
  3763.         UInt8        fPad;
  3764.     };
  3765.     
  3766.     typedef struct OTBufferInfo    OTBufferInfo;
  3767.     
  3768.     #define .i.OTInitBufferInfo;(infoPtr, theBuffer)    \
  3769.         (infoPtr)->fBuffer    = theBuffer;        \
  3770.         (infoPtr)->fPad    = theBuffer->fPad1;    \
  3771.         (infoPtr)->fOffset    = 0
  3772.  
  3773.         extern "C" Boolean .i.OTReadBuffer;(OTBufferInfo* info, void* buf, size_t* len);
  3774.         extern "C" size_t .i.OTBufferDataSize;(OTBuffer* bfr)
  3775.         extern "C" void .i.OTReleaseBuffer;(OTBuffer* bfr)
  3776.  
  3777. The OTBufferInfo structure keeps track of where you last left off in a buffer.  This allows you to read pieces of the data into multiple buffers, keeping track of where you left off.
  3778.  
  3779. OTReadBuffer reads *len bytes from the OTBuffer description stored in info into the buffer buf.  It returns true if the read request completely exhausted the bytes in the buffer, and it returns false if there are more bytes in the buffer to be read.  In all cases, *len is updated with the actual number of bytes copied.
  3780.  
  3781. OTBufferDataSize returns the number of data bytes in the OTBuffer (including bytes in the fNext chain).
  3782.  
  3783. OTReleaseBuffer returns the buffer to the system when you are done with it.
  3784.  
  3785. Depending on the API being used, a no-copy receive is requested by using the constant .i.kOTNetbufDataIsOTBufferStar;.
  3786.  
  3787.     enum
  3788.     {
  3789.         kOTNetbufDataIsOTBufferStar    = (size_t)-3
  3790.     };
  3791.  
  3792. A few examples follow:
  3793. {
  3794.     OTBuffer* myBuffer;
  3795.     OTResult result = Rcv(myEndpoint, &myBuffer, kOTNetbufDataIsOTBufferStar);
  3796. }
  3797. {
  3798.     OTBuffer*     myBuffer;
  3799.     TUnitData    data;
  3800.     OTFlags    flags;
  3801.  
  3802.     data.addr.buf        = &addrBuf;
  3803.     data.addr.maxlen    = sizeof(addrBuf);
  3804.     data.opt.maxlen    = 0;
  3805.     data.udata.buf    = (UInt8*)&myBuffer;
  3806.  
  3807.     data.udata.maxlen    = kOTNetbufDataIsOTBufferStar;
  3808.  
  3809.     OTStatus status = OTRcvUData(&data, &flags)
  3810. }
  3811.  
  3812. Once you have copied the data out of the OTBuffer, you should call OTReleaseBuffer to return it to Open Transport.
  3813. WARNING:  In many cases, for performance reasons, drivers will pass up their actual DMA buffers.  If this is the case, when you do a no-copy receive, you are getting the actual DMA buffers from the driver.  If you hold on to the buffer for too long, you may begin to starve the driver for DMA buffers, which will adversely affect the performance of the system.  It is very important that if you are doing a no-copy receive, you hold onto the buffer for as short a time as possible.  If it is necessary to hold on to the buffer for any length of time, overall performance will be better if you make a copy of the data and return the buffer to the system.
  3814.  
  3815. .c2.Autopush
  3816. Open Transport provides support for the autopush feature of STREAMS.   Under SVR4.2, autopush information is base on device major numbers.  On systems which allow dynamic loading of modules, this does not make sense.  It would require that devices be loaded before autopush information could be configured.  So, instead of using major numbers, Open Transport uses the device name, even though this does not match the SVR4.2 implementation.
  3817. Autopush is implemented by talking to the system administration STREAMS module, named "sad".  All configuration is done by means of IOCTL command to the "sad" module.  The following are the pertinent structures:
  3818.  
  3819.  
  3820. #define kSADModuleName    "sad"
  3821.     
  3822. enum
  3823. {
  3824.     kOTAutopushMax= 8,
  3825.         
  3826.     I_SAD_SAP    = MIOC_CMD(MIOC_SAD, 1),    /* Set autopush information    */
  3827.     I_SAD_GAP    = MIOC_CMD(MIOC_SAD, 2),    /* Get autopush information    */
  3828.     I_SAD_VML    = MIOC_CMD(MIOC_SAD, 3)    /* Validate a list of modules */
  3829. };
  3830.  
  3831. /* I_LIST structures */
  3832. struct str_list 
  3833. {
  3834.     int             sl_nmods;    /* number of modules in sl_modlist array */
  3835.     struct str_mlist*    sl_modlist;
  3836. };
  3837.  
  3838. struct str_mlist 
  3839. {
  3840.     char    l_name[FMNAMESZ + 1];
  3841. };
  3842.  
  3843. struct OTAutopushInfo  /* Ioctl structure used for SAD_SAP and SAD_GAP commands */
  3844. {
  3845.     unsigned int    sap_cmd;
  3846.     char        sap_device_name[kMaxModuleNameSize];
  3847.     long        sap_minor;
  3848.     long        sap_lastminor;
  3849.     long        sap_npush;
  3850.     char        sap_list[kOTAutopushMax][kMaxModuleNameSize];
  3851. };
  3852.  
  3853. typedef struct OTAutopushInfo    OTAutopushInfo;
  3854.  
  3855. /*
  3856.  * Command values for sap_cmd
  3857.  */
  3858.  
  3859. enum
  3860. {
  3861.     kSAP_ONE        = 1,    /* Configure a single minor device        */
  3862.     kSAP_RANGE        = 2,    /* Configure a range of minor devices    */
  3863.     kSAP_ALL        = 3,    /* Configure all minor devices        */
  3864.     kSAP_CLEAR        = 4    /* Clear autopush information        */
  3865. };
  3866.  
  3867. Autopush information is set, retrieved and cleared by using sending IOCTLs to the "sad" driver.  These IOCTLs may be either I_STR IOCTLs or "transparent" IOCTLs.  In order to set or get autopush information, you must allocate an OTAutopushInfo structure.  
  3868. To set autopush information about a module, set the sap_cmd field to one of the command values specificed above, set up the sap_minor and sap_lastminor numbers (if applicable) , and set the sap_device_name field to a "C"-style string containing the name of the device about which autopush information is desired. Fill in the sap_npush field with the number of modules to autopush, and then fill in the sap_list with the names of the modules to autopush.  Then execute code that looks like the following:
  3869.  
  3870. struct strioctl    stri;
  3871. stri.ic_cmd = I_SAD_SAP;
  3872. stri.ic_dp    = &myOTAutopushInfoStructure;
  3873. stri.ic_len    = sizeof(OTAutopushInfo);
  3874. stri.ic_timout = -1;
  3875. err = OTStreamIoctl(myStreamRef, I_STR, (void*)&stri);
  3876.  
  3877. or
  3878.  
  3879. err = OTStreamIoctl(myStreamRef, I_SAD_SAP, (void*)&stri);
  3880.  
  3881. This will set the autopush information for the module.  Use kSAP_ALL to configure all minor numbers of a device.  This is normally the value that will be used to configure autopush.  For specialty usage, you can use kSAP_ONE to configure a single minor number (specified in the sap_minor field) or kSAP_RANGE to configure a range of minor numbers (specified with the lower value in the sap_minor field and the higher value in the sap_lastminor field).  The kSAP_CLEAR command can be used to clear a previous autopush.  Set sap_minor to 0 to clear all autopush information for a module.  Otherwise, you can clear a single range or minor number by specifying sap_minor and sap_lastminor value.  The sap_lastminor field can be set to -1 to clear the range set that started with sap_minor.  Note that you cannot clear ranges that overlap with ranges that were set by two individual kSAP_RANGE commands (you'll get a kEEXISTErr).
  3882. kENODEVErr        the module specified is not configured for autopush.
  3883. kENOSTRErr        the module specified does not exist in the system
  3884. kEINVALErr        the command specified is not recognized by "sad"
  3885. kERANGEErr    the minor number range specified was invalid, or the range is not configured for autopush (when clearing a range).
  3886. kEEXISTErr    an attempt was made to configure or clear a minor number or minor number range  that overlaps an existing range of minor numbers
  3887.  
  3888. You can use the I_SAD_GAP command to obtain the autopush information about a module.  Fill out the OTAutopushInfo structure for the module and minor number(s) desired, along with the appropriate command code (kSAP_ALL, kSAP_RANGE, or kSAP_ONE). and you will get back the OTAutopushInfo structure that was used to set that particular autopush.  For instance, if you ask for a single minor number, and it was programmed as part of a range, you will get back the kSAP_RANGE or kSAP_ALL. information that was used to set the autopush information
  3889. .c2.Ownership of Providers
  3890. Open Transport attempts to "death watch" providers (including endpoints, mappers, and services providers).  If a client dies or quits without closing all it's outstanding providers, Open Transport attempts to "clean up" and close them on behalf of the client.  This leads to an interesting problem.  Every shared library, code resource, or application that creates an endpoint, or uses one of the endpoint functions that allocate memory on behalf of the client (list follows) must be a client of Open Transport (having called InitOpenTransport).  For ASLM shared libraries and applications, Open Transport can deathwatch the library or application easily.  For CFM shared libraries, the client MUST call CloseOpenTransport before terminating (this can be done by making CloseOpenTransport the termination procedure for the CFM library)  Since Open Transport keeps track of the owner of all providers, and closes them when the owner terminates, some provision must be made for transfering the ownership of a provider.   The function OTTransferProviderOwnership is intended for that purpose. You pass it a ProviderRef that you wish to obtain ownership of, and it will return a new ProviderRef that belongs to you.  The old ProviderRef is then obsolete and should not be used:
  3891.  
  3892. pascal ProviderRef OTTransferProviderOwnership(ProviderRef oldRef, OTClient oldOwner, OSStatus* errPtr);
  3893.  
  3894. You can use the OTWhoAmI function to obtain the OTClient value.  In order to transfer the ownership of the endpoint, the prior owner will need to give you it's OTClient value through some API.
  3895.  
  3896. pascal OTClient OTWhoAmI(void);
  3897.  
  3898.  
  3899. .c1.Appendix A - Sample Code;
  3900. For an examples of Open Transport clients, see the disk “Open Transport Samples” in the Open Transport software distribution.
  3901.  
  3902.  
  3903.  
  3904. .c1.Appendix B - Endpoint States;
  3905. This appendix lists and describes the endpoint states that are visible to Open Transport clients. It also provides tables showing which Open Transport routines change the state of endpoints.
  3906. Table B-1. Open Transport Endpoint States
  3907. State    Decimal value    Meaning
  3908. T_DATAXFER    5    This connection-oriented endpoint has a connection established; the endpoint can now send and receive data.
  3909. T_IDLE    2    The endpoint has been bound to a local protocol address. For non-connection-oriented endpoints, it is ready for use. For connection-oriented endpoints, the endpoint is ready to receive incoming connection requests, or for the client to initiate a connection.
  3910. T_INCON    4    The connection-oriented endpoint has received a connection request, and the client has not yet accepted (using the Accept function) or rejected (using the SndDisconnect function) the connection request.
  3911. T_INREL    7    The connection-oriented endpoint has received an incoming request for an orderly disconnect, and the client has not yet acknowledged the release (using the RcvOrderlyDisconnect function). The client may continue to send data on this endpoint, until acknowledging the release, but may no longer read incoming data. Not all endpoints support orderly disconnects.
  3912. T_OUTCON    3    The client has used the Connect function to initiate a connection request on a connection-oriented endpoint, and the connection has not yet been established.
  3913. T_OUTREL    6    The client has initiated an orderly disconnect (using the SndOrderlyDisconnect function), which the remote endpoint has not yet acknowledged. The client may continue to read data from the connection, but may not send any more data. Not all endpoints support orderly disconnects.
  3914. T_UNBND    1    The endpoint is initialized, but has not yet been bound to a local protocol address.
  3915. T_UNINIT    0    The endpoint is uninitialized. This value is returned whenever the system has closed an endpoint, but the client has not (For instance, when a Macintosh goes to sleep, most client providers are closed.  Clients are notified with a kOTProviderWillClose event, and if they don't close the provider, the system will do it for them).
  3916.  
  3917. .c1.Appendix C - Event Codes;
  3918. This appendix describes the codes that the Open Transport Library can send to a client’s notification routine. For more information about what your client should do when its notification routine receives a particular event code, refer to the section Event Handling.
  3919. Table C-1. Open Transport Event Codes
  3920. Event code    Hexadecimal value    Meaning
  3921. T_ACCEPTCOMPLETE    $20000003    An Accept function has completed.  The cookie parameter is a pointer to the receiving endpoint for the endpoint that issued the Accept function.  If the receiving endpoint is different than the one that issued the Accept function, it will receive a NULL in the cookie parameter.  
  3922. T_BINDCOMPLETE    $20000001    A Bind function has completed, and the cookie parameter is the retAddr parameter of the Bind call.
  3923. T_CONNECT    $2    An incoming connect response to a client initiated connection has been received. Use RcvConnect to receive it. The cookie parameter to the notification routine is the sndCall parameter of the client passed to the Connect call.
  3924. T_DATA    $4    Incoming data has arrived. Use Rcv or RcvUData to receive it.  Another T_DATA event will not be generating until Rcv or RcvUData has been called and returns a kOTNoDataErr error.
  3925. T_DELNAMECOMPLETE    $2000000E    A DeleteName  function has completed.  The cookie parameter is either the OTNameID (For OTDeleteNameByID) or it is the TNetbuf pointer that contained the name to delete (for OTDeleteName).
  3926. T_DISCONNECT    $10    A connection has been torn down. Also used to indicate a client initiated connect has been denied by the remote endpoint. Use RcvDisconnect to clear the event. The cookie parameter to the notifier is NULL for a T_DISCONNECT event that indicates an established connection has been torn down. If the T_DISCONNECT event indicates a rejected connection request, then the cookie parameter to the notification routine is the same as the sndCall parameter that the client passed to the Connect call.
  3927. T_DISCONNECTCOMPLETE    $20000005    A SndDisconnect function has completed, the cookie parameter is the call parameter of SndDisconnect
  3928. T_EXDATA    $8    Incoming expedited data has arrived. Use Rcv to receive it. Another T_EXDATA event will not be generating until Rcv has been called and returned either a kOTNoDataErr error, or returned normal (non-expedited) data.
  3929.  
  3930. T_GETINFOCOMPLETE    $2000000A    A GetEndpointInfo function has completed, and the cookie parameter to the notification routine is the info parameter of GetEndpointInfo
  3931. T_GETPROTADDRCOMPLETE    $20000008    A GetProtAddress function has completed, and the cookie parameter to the notifier is the peerAddr parameter that the client passed into the GetProtAddress call. If the client passed NULL as the peerAddr parameter, then the client’s boundAddr parameter is passed as the cookie.
  3932. T_GODATA    $100    Flow control restrictions have been lifted
  3933. T_GOEXDATA    $200    Flow control restrictions on the expedited data channel have been lifted.
  3934. T_LISTEN    $1    An incoming connection request has arrived. Call Listen to receive it.
  3935. T_LKUPNAMECOMPLETE    $2000000F    A LookupName function has completed.  The cookie parameter is the TLookupReply pointer passed in the LookupName call.
  3936. T_LKUPNAMERESULT    $20000010    A LookupName function has found a name and is returning it, but the lookup is not completed yet. The cookie parameter is the TLookupReply pointer passed in the LookupName call.
  3937. T_MEMORYRELEASED    $2000000C    This event is only used when a client has issued the AckSends function to an endpoint and the endpoint is asynchronous.  The event occurs when any sending function has completed and is done using the client memory. The cookie parameter is the buf parameter of Snd or the appropriate ".buf" parameter of the structure used to send data, and the result parameter is the length of that buffer (or the number of bytes that were sent from that buffer in the case of a send that was incomplete due to flow control).
  3938. T_OPENCOMPLETE    $20000007    An asynchronous open call is complete.  The cookie parameter will be set to the appropriate ProviderRef if no error occurred.
  3939. T_OPTMGMTCOMPLETE    $20000006    An OptionManagement function has completed, and the cookie parameter to the notification routine is the ret parameter that the client passed to the OptionManagement function. If the client specified NULL as the ret parameter, then the client’s req parameter is passed as the cookie.
  3940. T_ORDREL    $80    The remote client has called SndOrderlyDisconnect; your client should now call RcvOrderlyDisconnect.
  3941. T_REGNAMECOMPLETE    $2000000D    An RegisterName function has completed.  The cookie parameter is the TRegisterReply* parameter, unless it was NULL.  Then it is the TRegisterRequest* parameter.
  3942. T_REPLY    $0800    An incoming response to an outstanding request has been received. Use the RcvUReply or RcvReply function to read the reply. Another T_REPLY event will not be generating until RcvReply or RcvUReply has been called and returns a kOTNoDataErr error.
  3943. T_REPLYCOMPLETE    $20000004    A SndUReply or SndReply function has completed, and the cookie parameter is the sequence number of the original request.
  3944. T_REQUEST    $400    An incoming request has been received. Use RcvRequest or RcvURequest to receive it. Another T_REQUEST event will not be generating until RcvRequest or RcvURequest has been called and returns a kOTNoDataErr error.
  3945. T_RESET    $2000    A connection-oriented endpoint has received a reset from the remote end and has flushed all unread and unsent data. This only occurs for some types of endpoints, and generally leaves the endpoint in an unknown state.
  3946. T_RESOLVEADDRCOMPLETE    $20000009    A ResolveAddress function has completed, and the cookie parameter is the retAddr parameter of ResolveAddress
  3947. T_UDERR    $40    An SndUData function has failed after previously completing with no error.
  3948. T_UNBINDCOMPLETE    $20000002    An Unbind function has completed.  The cookie parameter is NULL.
  3949.  
  3950. .c1.Appendix D - Result Codes;
  3951. This appendix describes the result codes that Open Transport preferred-C routines return. For information about what your client should do when a particular function returns a particular code, refer to the description of that function. For information about XTI result codes, refer to the X/Open Transport Interface specification.
  3952. Table D-1. Open Transport Preferred Result Codes corresponding to XTI result codes
  3953. Result code    Value    Meaning
  3954. kOTAccessErr    -3152    The user does not have permission to negotiate the specified address or options.
  3955. kOTAddressBusyErr    -3172    The requested address is in use, or this endpoint does not support multiple connections with the same local and remote addresses. This result code indicates that a connection already exists. As a return value for a Bind call, it may also indicate that no dynamic addresses are available for protocols or configuration methods that allow dynamic addressing. 
  3956. kOTBadAddressErr    -3150    The specified protocol address was in an incorrect format or contained illegal information.
  3957. kOTBadDataErr    -3159    The amount of client data specified was not within the bounds allowed by the endpoint.
  3958. kOTBadFlagErr    -3165    An invalid flag was specified.
  3959. kOTBadNameErr    -3170    The endpoint name is invalid.
  3960. kOTBadOptionErr    -3151    The specified protocol options were in an incorrect format or contained illegal information.
  3961. kOTBadQLenErr    -3171    The argument qlen when the endpoint was bound with Bind was zero.
  3962. kOTBadReferenceErr    -3153    The specified EndpointRef or TEndpoint* does not refer to a valid endpoint.
  3963. kOTBadSequenceErr    -3156    An invalid sequence number was specified, or a NULL call pointer was specified when rejecting a connection request.
  3964. kOTBadSyncErr    -3179    A call to Sync was made at non-SystemTask time.
  3965. kOTBufferOverflowErr    -3160    The number of bytes allocated to hold a result is greater than zero, but not sufficient to store the result.
  3966. kOTCanceledErr    -3180    An outstanding call was canceled.
  3967. Table D-1 (cont'). Open Transport Preferred Result Codes
  3968. kOTFlowErr    -3161    The endpoint is in asynchronous mode, but the flow control mechanism prevents the endpoint from accepting any data at this time.
  3969. kOTIndOutErr    -3173    There are outstanding connection indications on the endpoint. All other connection indications must be handled either by rejecting them with SndDisconnect, or by accepting them with Accept.
  3970. kOTLookErr    -3158    An asynchronous event has occurred on this endpoint.
  3971. kOTNoAddressErr    -3154    The endpoint could not allocate an address, or an address was required and not supplied by the client. 
  3972. kOTNoDataErr    -3162    This endpoint is in non-blocking mode, but no data is currently available.  It is also returned by LookupName when no names are found.
  3973. kOTNoError     0000    The function completed execution without error.
  3974. kOTNoDisconnectErr    -3163    No disconnect indication is available.
  3975. kOTNoReleaseErr    -3166    No orderly release indication currently exists on this endpoint.
  3976. kOTStructureTypeErr    -3169    An unsupported structure type was passed in the structType field. This error is also returned when the structType field is inconsistent with the endpoint type.
  3977. kOTNotSupportedErr    -3167    This action is not supported by this endpoint.
  3978. kOTNoUDErrErr    -3164    No unit data error indication currently exists on this endpoint.
  3979. kOTOutStateErr    -3155    The function was issued in the wrong sequence.
  3980. kOTProviderMismatchErr    -3174    The endpoint that is to accept the connection is not the same kind of endpoint as this one.
  3981. kOTQFullErr    -3177    The maximum number of outstanding indications has been reached for the endpoint.
  3982. kOTProtocolErr    -3178    An unspecified protocol error occurred.
  3983. Table D-1 (cont'). Open Transport Preferred Result Codes
  3984. kOTResAddressErr    -3176    The address to which this endpoint is bound differs from that of the endpoint that received the connection request; thus, this endpoint cannot accept this connection request.
  3985. kOTResQLenErr    -3175    When this endpoint was bound (see Bind), the qlen parameter was greater than zero. But to accept a connection on an alternate end-point, such as this one, the endpoint must be bound with a qlen parameter equal to zero.
  3986. kOTStateChangeErr    -3168    The endpoint is undergoing a transient state change. This error is returned when a function call is made while an endpoint is in the process of changing states. The client should wait for an event indicating the endpoint has finished changing state and call the function again. (Note that the equivalent state-change error code, TSTATECHNG, is not described in the 1992 X/Open XTI specification.)   This error is also returned if you attempt to use an "incompatible" function while another operation is still ongoing (e.g. calling SndUData while an OptionManagement call is still outstanding).
  3987. Table D-2 Open Transport Preferred Result Codes corresponding to UNIX result codes
  3988. Result code    Value    Meaning
  3989. kENOENTErr    -3201    This error literally means "no such file or directory".  In XTI (and Open Transport) it is returned when an attempt is made to open an endpoint or mapper that does not exist in the system.
  3990. kENIOErr    -3204    An I/O error occurred.
  3991. kENXIOErr    -3205    ????.
  3992. kENOMEMErr    -3211    Open Transport cannot allocate enough memory to meet your request.
  3993. kEBUSYErr    -3215    The device you are trying to access is busy and could not complete your request.
  3994. kEINVALErr    -3221    ????
  3995. kEWOULDBLOCKErr    -3234    In order to complete the operation the request, Open Transport would have to block, and the endpoint is in non-blocking mode.
  3996. kETIMEDOUTErr    -3259    The requested operation timed out.
  3997.  
  3998. kENOSRErr    -3271    Open Transport cannot allocate enough system resources (usually STREAMS messages) to meet your request.
  3999.  
  4000.  
  4001. .c1.Appendix E - Open Transport and XTI
  4002. This appendix describes how Open Transport differs from XTI. Also, it describes which entities in the preferredC interface of Open Transport corresponds to which XTI entities, and vice versa.
  4003. CAUTION: The preferredC interface of Open Transport is based on XTI but is not identical with it. As a result, some elements have no XTI counterparts, and those that have counterparts are not necessarily identical with them. For definitive information about XTI, refer to the X/Open Transport Interface specification.
  4004. .c2.Function Names;
  4005. Table E-1. XTI-to-Open Transport Function Cross-Reference
  4006. XTI Function    Open Transport Function
  4007. t_accept    Accept
  4008. t_alloc    Alloc
  4009. t_bind    Bind
  4010. t_close    CloseProvider
  4011. t_connect    Connect
  4012. t_error    —
  4013. t_free    Free
  4014. t_getprotaddr    GetProtAddress
  4015. t_getinfo    GetEndpointInfo
  4016. t_getstate    GetEndpointState
  4017. t_listen    Listen
  4018. t_look    Look
  4019. t_open    OpenEndpoint
  4020. t_optmgmt    OptionManagement
  4021. t_rcv    Rcv 
  4022. t_rcvconnect    RcvConnect
  4023.  
  4024. Table E-1. XTI-to-Open Transport Function Cross-Reference (cont')
  4025. XTI Function    Open Transport Function
  4026. t_rcvdis    RcvDisconnect
  4027. t_rcvrel    RcvOrderlyDisconnect
  4028. t_rcvudata    RcvUData
  4029. t_rcvuderr    RcvUDErr
  4030. t_snd    Snd
  4031. t_snddis    SndDisconnect
  4032. t_sndrel    SndOrderlyDisconnect
  4033. t_sndudata    SndUData
  4034. t_strerror    —
  4035. t_sync    Sync
  4036. t_unbind    Unbind
  4037.  
  4038. Table E-2 describes shows which names in the Open Transport preferredC interface correspond to which names in the XTI-style interface.
  4039. Table E-2. Open Transport-to-XTI Function Cross-Reference
  4040. Open Transport Function    XTI Function
  4041. Accept    t_accept
  4042. AckSends    —
  4043. Alloc    t_alloc
  4044. Bind    t_bind
  4045. CloseProvider    t_close
  4046. Connect    t_connect
  4047. DontAckSends    —
  4048. Free    t_free
  4049. Table E-2. Open Transport-to-XTI Function Cross-Reference (cont')
  4050. Open Transport Function    XTI Function
  4051. GetEndpointInfo    t_getinfo
  4052. GetProtAddress    t_getprotaddr
  4053. GetNotifier    —
  4054. GetEndpointState    t_getstate
  4055. InstallNotifier    —
  4056. IsNonBlocking    —
  4057. IsSynchronous    —
  4058. Listen    t_listen
  4059. Look    t_look
  4060. OpenEndpoint    t_open
  4061. OptionManagement    t_optmgmt
  4062. Rcv    t_rcv
  4063. RcvConnect    t_rcvconnect
  4064. RcvDisconnect    t_rcvdis
  4065. RcvOrderlyDisconnect    t_rcvrel
  4066. RcvRequest    —
  4067. RcvUData    t_rcvudata
  4068. RcvUDErr    t_rcvuderr
  4069. RcvURequest    —
  4070. RemoveNotifier    —
  4071. ResolveAddress    —
  4072. SetAsynchronous    —
  4073. SetBlocking    —
  4074. SetNonBlocking    —
  4075. SetSynchronous    —
  4076.  
  4077. Table E-2. Open Transport-to-XTI Function Cross-Reference (cont')
  4078. Open Transport Function    XTI Function
  4079. Snd    t_snd
  4080. SndDisconnect    t_snddis
  4081. SndOrderlyDisconnect    t_sndrel
  4082. SndReply    —
  4083. SndRequest    —
  4084. SndUData    t_sndudata
  4085. SndUReply    —
  4086. SndURequest    —
  4087. Sync    t_sync
  4088. Unbind    t_unbind
  4089. .c2.Extensions to XTI;
  4090. Table E-3 lists the Open Transport routines that are not part of XTI. Although this document refers to these routines by their Open Transport preferred-C names, client can also call these routines by the XTI-style the names listed in the table.
  4091. Table E-3. Open Transport Functions not found in XTI
  4092. Open Transport Preferred-C Name    XTI-Style  Name
  4093. AckSends    —
  4094. DontAckSends    —
  4095. GetProtAddress    t_getprotaddr
  4096. InstallNotifier    t_installnotifier
  4097. IsNonBlocking    t_isnonblocking
  4098. IsSynchronous    t_issynchronous
  4099. RcvRequest    t_rcvrequest
  4100. RcvURequest    t_rcvurequest
  4101. RemoveNotifier    t_removenotifier
  4102. ResolveAddress    t_resolveaddr
  4103. SetAsynchronous    t_asynchronous
  4104. SetSynchronous    t_synchronous
  4105. SndReply    t_sndreply
  4106. SndRequest    t_sndrequest
  4107. SndUReply    t_sndureply
  4108. SndURequest    t_sndurequest
  4109.  
  4110. .c2.Data Structures;
  4111. Many of the Open Transport functions take pointers to data structures as parameters. The table below shows the standard XTI data structure names and the corresponding preferred interface structure names.
  4112. Table E-4. XTI-to-Open Transport Data Structure Cross-Reference
  4113. XTI Name    Open Transport Name
  4114. int fd    EndpointRef fd
  4115. t_info    TEndpointInfo
  4116. t_netbuf    TNetbuf
  4117. t_bind    TBind
  4118. t_discon    TDiscon
  4119. t_call    TCall
  4120. t_unitdata    TUnitData
  4121. t_uderr    TUDErr
  4122. t_optmgmt    TOptMgmt
  4123. .c2.Result Codes;
  4124. When an XTI style function fails, it returns -1 to indicate an error has occurred, and the error is stored in a global variable t_errno. If the value of the error is .i.TSYSERR;, then the actual error can be found in the global variable errno. The XTI error numbers are small positive integers.
  4125. When an Open Transport preferred function fails, the error code is returned as the result of the function. No global variables are used and all errors are negative numbers.
  4126. XTI error codes are small positive numbers with defined constants for each that look like TBADADDR or TFLOW. The Open Transport error codes are negative numbers for consistency with the Macintosh Toolbox, and they have names like kOTBadAddressErr and kOTFlowErr. There is a corresponding Open Transport error code for every XTI error code.
  4127. Table E-5 shows the mapping of XTI error names onto Open Transport error names.
  4128.  
  4129. Table E-5. XTI-to-Open Transport Result Code Cross-Reference
  4130. XTI Result Code    Open Transport Result Code
  4131. TACCES    kOTAccessErr
  4132. TADDRBUSY    kOTAddressBusyErr
  4133. TBADADDR    kOTBadAddressErr
  4134. TBADDATA    kOTBadDataErr
  4135. TBADF    kOTBadReferenceErr
  4136. TBADFLAG    kOTBadFlagErr
  4137. TBADNAME    kOTBadNameErr
  4138. TBADOPT    kOTBadOptionErr
  4139. TBADQLEN    kOTBadQLenErr
  4140. TBADSEQ    kOTBadSequenceErr
  4141. TBADSYNC    kOTBadSyncErr
  4142. TBUFOVFLW    kOTBufferOverflowErr
  4143. TCANCELED    kOTCanceledErr
  4144. TFLOW    kOTFlowErr
  4145. TINDOUT    kOTIndOutErr
  4146. TLOOK    kOTLookErr
  4147. TNOADDR    kOTNoAddressErr
  4148. TNODATA    kOTNoDataErr
  4149. TNODIS    kOTNoDisconnectErr
  4150. TNOREL    kOTNoReleaseErr
  4151. TNOSTRUCTYPE    kOTStructureTypeErr
  4152. TNOTSUPPORT    kOTNotSupportedErr
  4153. TNOUDERR    kOTNoUDErrErr
  4154. TOUTSTATE    kOTOutStateErr
  4155. TPROTO    —
  4156. TPROVMISMATCH    kOTProviderMismatchErr
  4157. TQFULL    kOTQFullErr
  4158. TRESADDR    kOTResAddressErr
  4159. TRESQLEN    kOTResQLenErr
  4160. TSTATECHNG    kOTStateChangeErr
  4161. TSYSERR    -
  4162.  
  4163. .c1..i.Index
  4164.  
  4165. abortive disconnect 95
  4166. absolute requirement 72
  4167. Accept 105
  4168. AckSends 9, 24
  4169. address book 1
  4170. ADSP 96
  4171. Alloc 65
  4172. asynchronous events 10
  4173. Asynchronous mode 35
  4174. Bind 50
  4175. Blocking 9
  4176. CancelReply 148
  4177. CancelRequest 147
  4178. CancelSynchronousCalls 28
  4179. CancelUReply 135
  4180. CancelURequest 134
  4181. Chooser/Browser 1
  4182. CleanupLibraryManager 4
  4183. CloseOpenTransport 4, 160
  4184. completion events 10
  4185. Connect 99
  4186. Data structures 39
  4187. Datagram
  4188. connectionless 30
  4189. DeleteName 155, 156
  4190. device name 8
  4191. device types 8
  4192. DontAckSends 25
  4193. Endpoint 30, 45, 47, 55
  4194. ETSDU 42, 114
  4195. Event handling 12, 38
  4196. Events 10
  4197. expedited data 114
  4198. Figure
  4199. State Diagram 33, 35
  4200. TNetbuf 41
  4201. Free 68
  4202. Gestalt 4
  4203. GetEndpointInfo 55
  4204. GetEndpointState 57
  4205. GetProtAddress 59
  4206. Getting Started 4
  4207. Index 217
  4208. InitLibraryManager 4
  4209. InitOpenTransport 4, 159
  4210. InstallNotifier 14
  4211. Ioctl 27
  4212. IsAckingSends 26
  4213. IsNonBlocking 23
  4214. IsSynchronous 19
  4215. kOTNetbufDataIsOTBufferStar 192
  4216. Listen 103
  4217. Look 58
  4218. LookupName 157
  4219. mapper 150, 152
  4220. Mode of operation 17
  4221. Modes of operation 9
  4222. module name 8
  4223. NetBIOS 96
  4224. notifier 14
  4225. notifier routine 12
  4226. Notifiers 12
  4227. OptionManagement 69, 79
  4228. orderly disconnect 95
  4229. orderly release 30
  4230. OTAsyncOpenEndpoint 47
  4231. OTAsyncOpenMapper 152
  4232. OTBuffer 191
  4233. OTBufferDataSize 192
  4234. OTBufferInfo 192
  4235. OTCancelSystemTask 182
  4236. OTCanMakeSyncCall 183
  4237. OTCloneConfiguration 161
  4238. OTCloseProvider 20
  4239. OTConfiguration 6, 160, 161, 162
  4240. OTCreateConfiguration 160
  4241. OTCreateDeferredTask 184
  4242. OTCreateOptions 163
  4243. OTCreateOptionString 165
  4244. OTCreatePortRef 174
  4245. OTCreateSystemTask 179
  4246. OTData 40
  4247. OTData Structure 41
  4248. OTDelay 170
  4249. OTDeleteNameByID 156
  4250. OTDestroyConfiguration 162
  4251. OTDestroyDeferredTask 185
  4252. OTDestroySystemTask 180
  4253. OTEnterInterrupt 167
  4254. OTFindPort 172
  4255. OTFindPortByRef 173
  4256. OTGetBusTypeFromPortRef 177
  4257. OTGetDeviceTypeFromPortRef 176
  4258. OTGetIndexedPort 171
  4259. OTGetSlotFromPortRef 178
  4260. OTIdle 169
  4261. OTInitBufferInfo 192
  4262. OTLeaveInterrupt 168
  4263. OTNotifyProcPtr 13
  4264. OTOpenEndpoint 45
  4265. OTOpenMapper 150
  4266. OTPortRecord 6, 171
  4267. OTReadBuffer 192
  4268. OTReleaseBuffer 192
  4269. OTScheduleDeferredTask 186
  4270. OTScheduleSystemTask 181
  4271. OTYieldPortRequest 187
  4272. port name 8
  4273. Preferred C 2
  4274. Preferred C++ 2
  4275. provider 20
  4276. Providers 5
  4277. Rcv 118
  4278. RcvConnect 101
  4279. RcvDisconnect 110
  4280. RcvOrderlyDisconnect 113
  4281. RcvReply 145
  4282. RcvRequest 140
  4283. RcvUData 90
  4284. RcvUDErr 88
  4285. RcvUReply 132
  4286. RcvURequest 127
  4287. RegisterName 153
  4288. RemoveNotifier 16
  4289. ResolveAddress 61
  4290. SetAsynchronous 18
  4291. SetBlocking 21
  4292. SetNonBlocking 22
  4293. SetSynchronous 17
  4294. Setting 17
  4295. Snd 115
  4296. SndDisconnect 95, 108
  4297. SndOrderlyDisconnect 112
  4298. SndReply 142
  4299. SndRequest 138
  4300. SndUData 86
  4301. SndUReply 129
  4302. SndURequest 125
  4303. Specifying ports 6
  4304. Specifying provider services 6
  4305. States 31, 57
  4306. Stream
  4307. connection-oriented 30
  4308. Sync 63
  4309. TCP 96
  4310. TEndpointInfo 40, 42
  4311. TEndpointInfo Structure 42
  4312. TNetbuf 40
  4313. TNetbuf Structure 40
  4314. TOTNotifier 12
  4315. TP4 96
  4316. Transaction
  4317. connection-oriented 30, 137
  4318. connectionless 30
  4319. Transaction Protocols 2
  4320. TransferOwnership 29
  4321. transport provider 30
  4322. Transport Service Data Units 114
  4323. Transport Transparency 1
  4324. TSDU 42, 114
  4325. TSYSERR 214
  4326. T_ACCEPTCOMPLETE 106
  4327. T_DISCONNECT 96
  4328. T_DISCONNECTCOMPLETE 96
  4329. T_MEMORYRELEASED 9
  4330. T_ORDREL 96
  4331. Unbind 53
  4332. XTI 1
  4333. XTI-style 2
  4334.